在做图像分类、目标检测等深度学习项目时,我们常常需要大量的图片数据集。手动下载图片效率极低,而通过 Python 爬虫批量爬取百度图片,能快速获取指定关键词的图片资源。本文将从零开始,教你实现百度图片的批量爬取,代码简洁易懂,适配新手学习,同时兼顾实用性和健壮性。

适用场景

  • 深度学习数据集构建(如图像分类、目标检测数据集)
  • 自媒体素材收集
  • 个人图片库整理
  • 数据分析与可视化

技术栈

  • Python 3.8+(兼容性最佳)
  • requests:发送网络请求
  • BeautifulSoup:解析 HTML 页面
  • os:文件目录操作
  • time:控制请求频率,避免被封 IP

爬取原理分析

百度图片的展示页面采用动态加载+静态 HTML 混合的方式,核心逻辑:

  1. 访问 https://image.baidu.com/search/index?tn=baiduimage&word=关键词 获取图片列表页;
  2. 解析页面中的图片 URL(百度图片会返回缩略图和原图链接,本文爬取原图);
  3. 批量请求图片 URL,将二进制数据保存为本地图片文件;
  4. 加入请求延迟、异常处理,保证爬虫稳定性。

完整实现代码

1. 环境准备

首先安装依赖库:打开python命令窗口(作者使用pycharm可视化软件)

pip install requests beautifulsoup4
2. 核心爬虫代码

自己在python里新建文件,复制代码运行即可,代码响应url是百度图片,可自行修改

import requests
import re
import os

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}
name = input('请输入要爬取的图片类别:')
num = 0
num_1 = 0
num_2 = 0
x = input('请输入要爬取的图片数量?(1等于60张图片,2等于120张图片):')
list_1 = []
for i in range(int(x)):
    name_1 = os.getcwd()
    name_2 = os.path.join(name_1, 'data/' + name)
    url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + name + '&pn=' + str(i * 30)
    res = requests.get(url, headers=headers)
    htlm_1 = res.content.decode()
    a = re.findall('"objURL":"(.*?)",', htlm_1)
    if not os.path.exists(name_2):
        os.makedirs(name_2)
    for b in a:
        try:
            b_1 = re.findall('https:(.*?)&', b)
            b_2 = ''.join(b_1)
            if b_2 not in list_1:
                num = num + 1
                img = requests.get(b)
                f = open(os.path.join(name_1, 'data/' + name, name + str(num) + '.jpg'), 'ab')
                print('---------正在下载第' + str(num) + '张图片----------')
                f.write(img.content)
                f.close()
                list_1.append(b_2)
            elif b_2 in list_1:
                num_1 = num_1 + 1
                continue
        except Exception as e:
            print('---------第' + str(num) + '张图片无法下载----------')
            num_2 = num_2 + 1
            continue
# 为了防止下载的数据有坏图,直接在下载过程中对数据进行清洗
print('下载完成,总共下载{}张,成功下载:{}张,重复下载:{}张,下载失败:{}张'.format(num + num_1 + num_2, num, num_1, num_2))

运行代码:输入“1”表示搜索60张图片

        本文实现的百度图片爬虫,兼顾了新手友好性和实用性,核心逻辑清晰,可直接用于深度学习数据集构建、素材收集等场景。使用时需注意遵守百度的 robots 协议,合理控制爬取频率,避免对服务器造成压力。

        如果需要爬取更多图片或适配更复杂的反爬场景,可以在此基础上扩展多线程、代理 IP 等功能。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐