网页爬取:如何下载无img标签的鼠标悬停显示图片?
解决鼠标悬停显示图片的下载问题
从你提供的HTML代码来看,每个目标div的onmouseover属性中,playx函数的第一个参数就是图片文件名(比如img311.jpg、img312.jpg)。下面提供两种可行的下载方案:
方法1:直接提取图片URL下载(最便捷)
不需要模拟交互,直接从HTML属性中提取图片名并拼接完整URL下载:
from splinter import Browser import requests # 初始化浏览器并访问目标页面 browser = Browser('chrome') browser.visit("你的目标页面完整URL") # 获取所有包含悬停图片的div元素 target_divs = browser.find_by_css('.genre.scanme') for div in target_divs: # 提取onmouseover属性值,拆分出图片文件名 onmouseover_content = div['onmouseover'] img_filename = onmouseover_content.split('"')[1] # 拼接完整图片URL(需根据网站实际图片存储路径调整,示例假设图片在域名根目录) base_url = f"{browser.url.split('://')[0]}://{browser.url.split('/')[2]}" img_url = f"{base_url}/{img_filename}" # 下载图片 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"} response = requests.get(img_url, headers=headers) if response.status_code == 200: with open(img_filename, 'wb') as f: f.write(response.content) print(f"图片 {img_filename} 下载完成") browser.quit()
方法2:模拟鼠标悬停后加载图片再下载
如果图片URL带有动态参数或需要触发加载逻辑,可通过模拟悬停让图片显示,再获取其真实URL:
Splinter实现
from splinter import Browser from splinter.driver.webdriver.actions import ActionChains import requests browser = Browser('chrome') browser.visit("你的目标页面完整URL") target_divs = browser.find_by_css('.genre.scanme') action_chains = ActionChains(browser.driver) for div in target_divs: # 模拟鼠标悬停,触发图片加载 action_chains.move_to_element(div._element).perform() # 等待图片元素加载(需替换为实际页面中悬停图片的选择器,示例用id选择器) browser.is_element_present_by_css('#hover-display-img', wait_time=3) img_element = browser.find_by_css('#hover-display-img').first img_url = img_element['src'] # 下载图片 img_filename = img_url.split('/')[-1] headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"} response = requests.get(img_url, headers=headers) if response.status_code == 200: with open(img_filename, 'wb') as f: f.write(response.content) print(f"图片 {img_filename} 下载完成") # 鼠标移开,避免干扰下一个元素 action_chains.move_to_element(browser.find_by_tag('body').first._element).perform() browser.quit()
Selenium实现
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import requests driver = webdriver.Chrome() driver.get("你的目标页面完整URL") wait = WebDriverWait(driver, 10) # 等待目标div加载完成 target_divs = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '.genre.scanme'))) action_chains = ActionChains(driver) for div in target_divs: # 悬停触发图片加载 action_chains.move_to_element(div).perform() # 等待图片元素出现(替换为实际图片选择器) img_element = wait.until(EC.presence_of_element_located((By.ID, 'hover-display-img'))) img_url = img_element.get_attribute('src') # 下载图片 img_filename = img_url.split('/')[-1] headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"} response = requests.get(img_url, headers=headers) if response.status_code == 200: with open(img_filename, 'wb') as f: f.write(response.content) print(f"图片 {img_filename} 下载完成") # 鼠标移开 action_chains.move_to_element(driver.find_element(By.TAG_NAME, 'body')).perform() driver.quit()
关键注意点
- URL路径调整:如果网站图片存放在子目录(如
/static/images/),需要修改拼接URL的逻辑,确保路径正确。 - 反爬规避:添加合理的
User-Agent请求头,避免被网站拦截。 - 选择器验证:模拟悬停时,需通过浏览器开发者工具确认加载后图片的真实选择器(ID、CSS类等),替换示例中的占位选择器。
内容的提问来源于stack exchange,提问作者duarte harris
相关产品推荐
相关产品推荐

