Python 爬虫实战:批量下载百度图片
1. 前言
网络爬虫(Web Crawler)是自动化抓取网页信息的程序,广泛应用于数据采集、监控和分析。本教程将深入讲解如何使用 Python 编写一个高效的爬虫程序,实现批量下载百度搜索结果中的图片。通过本项目,读者可以掌握 HTTP 请求、JSON 数据解析、文件 IO 操作以及基本的反爬策略。
使用 Python 和 requests 库批量下载百度图片的方法。通过分析百度图片搜索接口的网络请求参数,解析返回的 JSON 数据获取图片链接,并实现本地保存功能。内容涵盖环境配置、接口分析、代码编写及反爬策略优化,适合初学者入门网络爬虫开发。

网络爬虫(Web Crawler)是自动化抓取网页信息的程序,广泛应用于数据采集、监控和分析。本教程将深入讲解如何使用 Python 编写一个高效的爬虫程序,实现批量下载百度搜索结果中的图片。通过本项目,读者可以掌握 HTTP 请求、JSON 数据解析、文件 IO 操作以及基本的反爬策略。
在开始之前,请确保你的开发环境已安装 Python 3.x 版本,并安装了 requests 库用于发送网络请求。
pip install requests
如果未安装,上述命令会自动从 PyPI 下载并安装依赖包。
打开百度图片搜索页面,输入关键词(如'玫瑰'),按回车键查看结果。观察发现,初始加载的图片数量有限,随着鼠标滚动加载更多图片。这表明页面采用了异步加载技术(AJAX),而非一次性渲染所有 HTML。
可以发现返回的数据格式为 JSON,其中包含了图片的缩略图链接和原始图片链接。关键参数包括:
queryWord: 搜索关键词(URL 编码后)。pn: 分页偏移量(每页 30 张)。例如 pn=0, pn=30, pn=60。rn: 返回数量(通常为 30)。tn: 固定参数,标识请求类型。通过分析多个请求,我们可以发现 URL 的结构具有规律性。核心 API 地址通常为 https://image.baidu.com/search/acjson。我们需要动态替换其中的关键词和分页参数来构建完整的请求 URL。
基于上述分析,我们设计一个面向对象的结构来管理爬虫逻辑。主要包含初始化、目录创建、链接获取、图片保存和主运行流程。
# -*- coding: utf-8 -*-
import requests
import json
from urllib import parse
import os
import time
import random
class BaiduImageSpider(object):
def __init__(self):
# 请求到的 json 文件数量(一个 json 文件包含 30 个图像文件)
self.json_count = 0
# 基础请求 URL 模板
self.url_template = (
'https://image.baidu.com/search/acjson?tn=resultjson_com&logid='
'&ipn=rj&ct=201326592&is=&fp=result&queryWord={}&cl=2&lm=-1&ie=utf-8'
'&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word={}'
'&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr='
'&expermode=&nojc=&pn={}&rn=30&gsm=1e&'
)
# 存储目录模板
self.directory_template = r"./download/{}"
# 请求头,模拟浏览器行为
self.header = {
'User-Agent': (
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30'
)
}
# 创建存储文件夹
def create_directory(self, name):
# 格式化目录路径
base_dir = self.directory_template.format(name)
if not os.path.exists(base_dir):
os.makedirs(base_dir)
return base_dir
# 获取图像链接列表
def get_image_link(self, url):
list_image_link = []
try:
strhtml = requests.get(url, headers=self.header, timeout=10)
strhtml.encoding = 'utf-8'
jsonInfo = json.loads(strhtml.text)
# 安全访问 data 字段
if 'data' in jsonInfo and len(jsonInfo['data']) > 0:
for item in jsonInfo['data']:
if 'thumbURL' in item:
list_image_link.append(item['thumbURL'])
except Exception as e:
print(f"获取链接失败:{e}")
return list_image_link
# 下载图片
def save_image(self, img_link, filename):
try:
res = requests.get(img_link, headers=self.header, timeout=10)
if res.status_code == 200:
with open(filename, "wb") as f:
f.write(res.content)
return True
else:
print(f"图片 {img_link} 下载出错,状态码:{res.status_code}")
return False
except Exception as e:
print(f"下载异常:{e}")
return False
# 入口函数
def run(self):
searchName = input("请输入查询内容:")
if not searchName:
print("查询内容不能为空")
return
searchName_parse = parse.quote(searchName)
target_dir = self.create_directory(searchName)
pic_number = 0
total_images = 0
print(f"开始下载,目标目录:{target_dir}")
for index in range(self.json_count):
pn = index * 30
request_url = self.url_template.format(
searchName_parse,
searchName_parse,
str(pn)
)
list_image_link = self.get_image_link(request_url)
for link in list_image_link:
pic_number += 1
file_name = f"{target_dir}/{str(pic_number)+'.jpg'}"
if self.save_image(link, file_name):
total_images += 1
# 随机休眠,防止被封 IP
time.sleep(random.uniform(0.2, 0.5))
print(f"{searchName}----图像下载完成---------> 共下载 {total_images} 张")
if __name__ == '__main__':
spider = BaiduImageSpider()
# 定义下载组数,每组 30 张
spider.json_count = 10
spider.run()
URL 中只能包含 ASCII 字符,中文需要进行 URL 编码。使用 urllib.parse.quote() 可以将中文转换为 %xx 格式,确保服务器能正确识别搜索词。
在实际网络环境中,请求可能超时或返回非 200 状态码。代码中加入了 try-except 块捕获异常,避免程序因单张图片错误而崩溃。同时增加了 timeout 参数防止请求无限挂起。
time.sleep() 降低请求频率。进阶方案可引入代理 IP 池或多线程并发控制。random.uniform 使请求间隔不固定,进一步模拟人类行为。部分图片链接可能失效或需要 Referer 验证。如果发现大量 404,可以尝试在请求头中添加 Referer 字段指向百度图片首页。
确保程序有权限在当前目录下创建文件夹。如果在 Linux/Mac 系统下,注意路径分隔符 / 与 Windows 下的差异,建议使用 os.path.join 处理路径。
爬虫技术应遵守相关法律法规及目标网站的 robots.txt 协议。请勿用于非法用途,尊重版权,仅用于个人学习或合法授权场景。
本文详细介绍了利用 Python 批量下载百度图片的全过程。从网络抓包分析到代码实现,再到异常处理和反爬策略,涵盖了爬虫开发的核心知识点。通过修改 json_count 参数,用户可以灵活控制下载数量。希望本教程能帮助初学者快速入门网络爬虫开发,并在此基础上探索更复杂的数据采集任务。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online