Products
GG网络技术分享 2026-04-16 02:19 1
最近想收集一些特定主题的图片素材,手动一张张下载实在太费时间了。作为一个懒人程序员,我决定写个爬虫来自动完成这个任务。今天就跟大家分享这个实用的百度图片爬虫,它能自动搜索并下载你想要的任何图片。说实话, 写这玩意儿的时候我心情挺复杂的,又觉得百度这反爬机制真是让人头大,不过没关系,咱们程序员就是来解决问题的,哪怕头发掉光也要把图扒下来!
咱们先不急着看代码,先聊聊为啥要用Python。你想想, 要是用Java或者C++写个这玩意儿,光是配置环境就能让你劝退,还得处理各种乱七八糟的依赖,烦都烦死了。Python就不一样了pip install一下requests库一导, 火候不够。 齐活。不过呢,光有库还不行,你得懂点HTTP协议,懂点JSON解析,不然看到一堆乱码你只能干瞪眼。我刚开始学的时候,对着那个返回的JSON数据看了半天愣是没找到图片链接在哪,差点就把电脑给砸了。

深得我心。 在开始敲代码之前,你得先有个趁手的编辑器。虽然用记事本也能写,但那样真的太折磨人了连个高亮都没有,写错一个字符找半天。我这里随便列几个常用的工具,大家看着办,反正我是用PyCharm,虽然有时候卡得要死,但功能确实强。
| 工具名称 | 推荐指数 | 特点简介 | 适用人群 |
|---|---|---|---|
| PyCharm | ⭐⭐⭐⭐⭐ | 功能强大, 调试方便,就是有点吃内存 | 专业开发者,不想折腾配置的人 |
| VS Code | ⭐⭐⭐⭐ | 插件丰富,轻量级,启动快 | 喜欢折腾,希望界面好看的人 |
| Sublime Text | ⭐⭐⭐ | 极简主义,速度快,但调试功能弱 | 代码写得好,不需要调试的大神 |
| Jupyter Notebook | ⭐⭐⭐⭐ | 交互式编程,适合数据分析 | 数据科学家,喜欢一步步看后来啊的人 |
选好工具之后还得装几个库。requests是必须的, 用来发请求;json用来解析数据;os用来处理文件路径;time用来延时防止被封IP。这些库都是Python自带的或者很容易安装的,我就不废话怎么装了要是连这都不会,建议先去补补基础,杀疯了!。
这个爬虫虽然只有100多行代码, 但包含了请求处理、JSON解析、文件操作等实用技巧。我会详细解释每个部分的实现思路,让你不仅能使用这个爬虫,还能真正理解它的工作原理。咱们先来看看这个爬虫的总体结构,别被吓到了其实挺简单的。
class BaiduImageSpider: def __init__: # 初始化代码 def create_directory: # 创建保存图片的文件夹 def get_image_link: # 获取图片链接 def save_image: # 下载并保存图片 def run: # 主运行逻辑,整起来。
看到了吧?就这么几个方法,每个方法干一件事,清清楚楚。这种面向对象的设计虽然有点啰嗦, 但是逻辑清晰,以后要是想改功能,比如想换个搜索网站,直接改对应的方法就行,不用把整个代码都推翻重写。这就是代码的可维护性,懂不懂?
坦白讲... 初始化方法中,我们设置了几个重要的变量。这里有个坑, 就是那个URL地址,百度的接口经常变,说不定哪天这个接口就不能用了到时候还得重新抓包分析。不过目前这个接口还是好用的,大家放心用。还有那个保存路径, 我写的是 `C:\价值一个亿\python-mini-projects\projects\baidutupian\{}`,这路径有点长,主要是为了显得我很有志气,毕竟谁不想有一个亿呢?
def __init__: _count = 0 = 'https:///search/acjson?tn=resultjson_com&ipn=rj&queryWord={}&word={}&pn={}&rn=30' = r"C:\价值一个亿\python-mini-projects\projects\baidutupian\{}" = { 大胆一点... 'User-Agent': 'Mozilla/5.0 AppleWebKit/537.36 Chrome/58.0.3029.110 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://' } _counter = 0 # 新增全局图片计数器
这里面的headers很重要,特别是User-Agent和Referer。你要是不加这些,百度一看就知道你是爬虫,直接给你返回个错误或者空数据, 欧了! 那时候你就哭吧。User-Agent就是成浏览器,Referer是告诉百度你是从哪个页面过来的,装得越像越好。
蚌埠住了! 这个方法负责创建保存图片的文件夹。这步虽然简单, 但很关键,你要是不建文件夹,直接往根目录写文件,时间久了你的C盘就乱成一锅粥了找文件都得找半天。而且Windows的路径分隔符是个坑,有时候要用反斜杠,有时候要用正斜杠,搞不好就报错。所以我这里用了原始字符串 `r""`,省得转义转得头晕。
def create_directory: = += r'\{}',嚯...
那个 `exist_ok=True` 也是个细节, 要是文件夹已经存在了不加这个参数就会报错,程序直接崩了。加了它,如果文件夹存在就忽略,继续往下跑,多省心,脑子呢?。
这是爬虫的核心方法之一,负责从百度API获取图片链接。这一步是整个爬虫的灵魂,要是拿不到链接,后面全是白搭。这里我们用requests库发送GET请求, 然后把返回的JSON数据解析一下把里面的 `thumbURL` 提取出来。 栓Q了... 这个 `thumbURL` 就是图片的真实地址, 虽然可能是缩略图,但对于咱们来说够用了要是想下载原图,还得分析另一个字段,不过那个更麻烦,容易403,咱们就别贪心了。
def get_image_link: try: response = ( url, headers=, proxies={"http": None, "https": None}, 最终的最终。 timeout=10 ) _for_status return for item in .get if 'thumbURL' in item] except Exception as e: print return
CPU你。 这里我加了个 `timeout=10`,防止网络不好的时候一直卡在那不动。还有那个异常处理,必须要加,网络请求哪有不失败的?断网了、超时了、服务器崩了啥情况都可能发生。不加try-except,程序动不动就闪退,体验极差。
优化一下。 说到网络请求,有时候为了防止被封IP,咱们还得用代理。虽然我在代码里把代理设成了None,但大家得知道怎么用。下面这个表格列了几种常见的代理类型,大家可以根据自己的钱包厚度选择。
| 代理类型 | 速度 | 稳定性 | 成本 | 推荐场景 |
|---|---|---|---|---|
| 免费代理 | 慢 | 极差 | 0元 | 练手项目, 不在乎成功率 |
| 私密代理 | 中等 | 一般 | 低 | 小规模数据采集 |
| 隧道代理 | 快 | 高 | 高 | 商业级爬虫,大规模采集 |
| 自建代理 | 取决于服务器 | 可控 | 取决于服务器费用 | 有技术实力的团队 |
如果你真的要用代理,代码大概是这样的,别说我没告诉你:
proxies = { 'http': 'http://:port', 'https': 'http://:port' } response =,体验感拉满。
啊这... 这个方法负责下载并保存图片。拿到链接之后还得把图片数据下载下来写到硬盘里。这里用的是二进制写入模式 `"wb"`,千万别用文本模式,不然图片就废了。下载的时候我也加了headers, 有些图片服务器会检查Referer,你不带Referer它就不给你图片,这也是反爬的一种手段。
这里有个小技巧,就是那个 `print` 语句。虽然打印日志会稍微影响一点点速度,但是看着屏幕上一行行“成功保存”跳出来那种成就感简直爆棚! 是个狼人。 要是程序卡住了你也能通过再说说一条日志知道是在哪一步挂的,方便调试。
得了吧... 这是爬虫的主控制流程。这个 `run` 方法就是把前面那些方法串起来。先说说让你输入关键词,然后创建文件夹,接着循环请求百度接口。这里有个 `pn` 参数,是用来翻页的,每次加30,主要原因是百度一页一般显示30张图。`_count` 控制你要下多少页,别设太大,不然把百度爬崩了也不好,咱们要做个有素质的爬虫。
def run: searchName = input searchName_parse = _directory _counter = 0 # 重置计数器 for index in range: pn = index * 30 request_url = ) links = _image_link for link in links: filename = ) # 使用全局计数器 _image _counter += 1 # 计数器递增 print,是个狼人。
运行后会提示输入搜索关键词,然后就会自动下载图片到指定目录。那个 `time.sleep` 也是为了礼貌爬虫,别请求太快把人家服务器打挂了。虽然咱们想快点下完,但也不能太贪心是不是?
再说说程序的入口是这样的:
if __name__ == '__main__':
spider = BaiduImageSpider
_count = 10 # 下载10组图片
这个基础爬虫还可以进一步 。如果你觉得单线程太慢了像蜗牛爬一样,那就可以用多线程。Python的 `concurrent.futures` 库里的 `ThreadPoolExecutor` 简直是神器, YYDS! 几行代码就能实现多线程并发下载。速度直接起飞,不过要注意控制线程数,不然你的CPU会尖叫,带宽也会跑满,甚至可能触发百度的风控。
from import ThreadPoolExecutor with ThreadPoolExecutor as executor:,闹乌龙。
开搞。 用了多线程之后 那个 `time.sleep` 就可以适当缩短或者去掉了主要原因是线程之间本身就有等待时间。不过要注意线程平安问题, 虽然这里只是写文件,每个文件名都不一样,一般不会冲突,但要是涉及到共享变量,那就得加锁了不然数据乱套了别怪我没提醒你。
准确地说... 这个改进版的百度图片爬虫具有更好的稳定性、更详细的日志输出和更友好的使用体验。你可以根据自己的需求进一步 功能,比如添加图片去重、自动分类等功能。去重可以用MD5值比对,自动分类可以调用百度AI的接口,不过那些都是后话了先把基础打牢再说。
写爬虫其实挺有意思的,就像是在玩寻宝游戏,你永远不知道下一张图是什么。有时候还能发现一些意想不到的东西,当然有时候也会遇到一些不想看的东西, 切中要害。 这就得靠关键词过滤了。 Python是个好东西,希望大家都能用它来提高效率,解放双手,把时间花在更有意义的事情上,比如发呆,比如睡觉。
再说说 再给大家推荐几个常用的图片处理库,毕竟下载下来之后可能还得处理一下比如改改大小,转转格式什么的。
| 库名称 | 主要功能 | 难易程度 | 备注 |
|---|---|---|---|
| Pillow | 图片编辑、 格式转换 | 简单 | Python图像处理标准库 |
| OpenCV | 计算机视觉、复杂图像处理 | 难 | 功能强大,但学习曲线陡峭 |
| img2pdf | 图片转PDF | 简单 | 适合把漫画转成电子书 |
推倒重来。 好了废话不多说了代码都在上面了大家自己拿去玩吧。遇到报错别急着来问我,先看报错信息,再去百度搜,大部分问题都能解决。实在解决不了那可能是你的问题,不是代码的问题。祝大家爬得开心,图图满满!
Demand feedback