如何使用Python编写爬虫自动下载指定关键词的图片素材?

酷涛君_8041

酷涛君_8041

2026-06-27

230人浏览

原创

百度图片无法用requests+beautifulsoup直接抓取,因其依赖js渲染且接口加密;应使用selenium模拟浏览器并配置反检测参数,下载时需复用referer和ua以避免403,同时对url归一化和图片内容md5去重。

如何使用python编写爬虫自动下载指定关键词的图片素材?

requests + BeautifulSoup 抓取百度图片失败的常见原因

直接用 requests 请求百度图片搜索页,大概率拿到的是空结果或跳转到首页——因为百度图片现在完全依赖 JavaScript 渲染,requests 拿不到真实图片 URL。你看到的 HTML 里几乎没有 img 标签,只有占位容器和一堆 data-src 或 data-thumburl 属性,且这些字段被动态注入。

真正有效的做法是模拟 Ajax 请求,定位百度图片的接口地址(类似 /api/search/image 或带 tn=baiduimagedetail 的 referer),但该接口已加签名验证,参数(如 word、pn、rn)需配合时间戳、加密 token 才能生效,逆向成本高且极易失效。

  • 别浪费时间写正则解析百度 HTML —— 它每天都在改 DOM 结构
  • 不要尝试用 BeautifulSoup 提取 src 属性 —— 大部分 img 标签的 src 是 placeholder(如 data:image/png;base64,)
  • 如果必须用百度,建议改用其官方 API(需申请、有调用量限制),而非爬虫

用 Selenium + ChromeDriver 稳定获取图片 URL 的实操要点

Selenium 是目前最可靠的方式:它启动真实浏览器,等 JS 渲染完成后再提取 src 或 data-src。但默认配置下容易被识别为自动化工具,导致返回乱码、验证码或空列表。

关键在于启动参数和等待策略:

  • 必须禁用自动化特征:options.add_argument('--disable-blink-features=AutomationControlled'),并手动删除 navigator.webdriver 属性
  • 避免使用 time.sleep() 等固定延时,改用 WebDriverWait 等待图片容器(如 class="imgitem")出现
  • 滚动到底部触发懒加载:执行 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);"),再等新元素出现
  • 提取时优先读 data-src, fallback 到 data-thumburl 或 src;过滤掉 base64 开头的无效值

示例片段(仅核心逻辑):

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
<p>options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-blink-features=AutomationControlled')
driver = webdriver.Chrome(options=options)
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})
driver.get(f'<a href="https://www.php.cn/link/35bb97f361bcca162714c1c41fcfa775">https://www.php.cn/link/35bb97f361bcca162714c1c41fcfa775</a>}')
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'imgitem')))</p><h1>后续滚动、提取、去重...</h1>

下载图片时如何规避 403 和防盗链拦截

即使拿到 URL,直接用 requests.get(url) 下载常返回 403 Forbidden —— 因为目标服务器检查 Referer 和 User-Agent。百度、必应、谷歌图片都启用 Referer 防盗链。

python-script-generator
python-script-generator

快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。

下载

解决办法不是伪造一个 UA 就完事,而是复用浏览器会话中的完整请求头:

  • 从 Selenium 获取当前页面的 driver.get_cookies() 并转为 requests 可用格式(注意 domain 匹配)
  • 必须带上原始 Referer:headers['Referer'] = driver.current_url
  • UA 要和 driver 启动时一致,可通过 driver.execute_script("return navigator.userAgent") 动态获取
  • 对每个图片 URL 单独构造 session,避免 cookie 过期或污染

漏掉 Referer 或用错 UA,90% 的图片链接会直接 403。这不是网络问题,是服务端明确拒绝。

关键词搜索结果去重与文件名安全处理

同一张图在不同分页或不同尺寸下可能重复出现,URL 中常含随机参数(如 &t=xxx、&s=yyy),直接按 URL 哈希会误判为不同图片。

更稳妥的做法是截取 URL 中的主路径部分(去掉查询参数),再对响应内容做 MD5 校验:

  • 用 urllib.parse.urlparse(url).scheme + '://' + urllib.parse.urlparse(url).netloc + urllib.parse.urlparse(url).path 归一化 URL
  • 下载后读取二进制内容,计算 hashlib.md5(content).hexdigest(),用该 hash 做文件名前缀
  • 文件扩展名不能全信响应头里的 Content-Type,要结合 magic bytes 判断(如用 python-magic 库)
  • Windows 下避免文件名含 : " / | ? *,用 re.sub(r'[\/*?|]', '_', filename) 清洗

没做归一化和内容校验,你下载 100 张图,实际可能只有 30 张是真不同的——其余全是缩略图、水印图或参数变体。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python 爬虫

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1671

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4184

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1669

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

24297

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2967

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3007

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2323

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程