当前位置: 首页 > news >正文

Python 图片爬取入门:从手动下载到自动批量获取

前言

        想批量下载网页图片却嫌手动保存太麻烦?本文用 Python 带你实现自动爬取,从分析网站到代码运行,步骤清晰,新手也能快速上手,轻松搞定图片批量获取。

1.安装模块

        在开始爬取图片前,我们需要准备好工具和环境。这就像盖房子前要准备好砖瓦和工具一样,合适的环境能让后续操作更顺畅。

1.1环境安装

《Python开发环境终极指南:从Conda环境配置到VSCode、PyCharm、Jupyter深度优化》_conda系统环境配置-CSDN博客文章浏览阅读1.4k次,点赞47次,收藏31次。Jupyter Notebook允许用户在一个文档中结合代码、文字、数学公式和可视化图表,是教学、实验记录和可重复研究的理想工具。Jupyter Notebook是一种互动式的网页应用程序,让你在一个文档中写代码、运行代码、添加注释和插入图表。【菜单】---【设置】--【项目:你的项目目录】--【python解释器】--【添加解释器】--【添加本地解释器】不建议使用类似C:\Users\15740\\.conda\envs**这样的默认路径去创建虚拟环境。然后就可以创建python文件、写代码、运行即可~_conda系统环境配置 https://blog.csdn.net/xw3373409564/article/details/149201204?fromshare=blogdetail&sharetype=blogdetail&sharerId=149201204&sharerefer=PC&sharesource=xw3373409564&sharefrom=from_link这里建议使用Pycharm

1.2第三方模块与模块的调用

Python 模块化编程全解析:模块、包与第三方库管理指南-CSDN博客文章浏览阅读1.1k次,点赞30次,收藏22次。学好模块和包,是从"写脚本"到"开发项目"的关键一步。下次写代码时,试试把常用功能拆成模块——你会发现代码变得清爽又好维护! https://blog.csdn.net/xw3373409564/article/details/149452387?fromshare=blogdetail&sharetype=blogdetail&sharerId=149452387&sharerefer=PC&sharesource=xw3373409564&sharefrom=from_link

2.分析网站

        爬取图片的关键是找到图片的真实地址。就像找宝藏需要先看地图,我们需要用浏览器的 “开发者工具” 分析网站结构,找到图片的来源。

浏览器建议使用谷歌

2.1打开网页

打开一个包含图片的网页,例如:

2.2进入检查(或开发者选项)

  • 右键网页空白处,选择 “检查”(或按 F12 快捷键),打开开发者工具。
  • 这个工具就像 “透视镜”,能看到网页背后的代码和网络请求。

2.3Elements

进入如如下页面,Elements是网页的全部内容,

2.4network

  1. 切换到 Network 面板:这里记录了网页加载时的所有网络请求(如图片、文字、脚本等)。
  2. 选择 Fetch/XHR:图片数据通常通过 “异步请求” 加载,这里能过滤出我们需要的动态数据请求。
  3. 刷新网页或滑动加载:滑动网页时,新的图片会被加载,Network 面板会出现新的请求记录。

2.5Fetch/XHR

  1. 查看请求的 Preview:在 Fetch/XHR 列表中,点击一个请求,切换到 “Preview” 标签,这里能看到请求返回的数据(通常是 JSON 格式)。
  2. 寻找图片地址字段:在数据中逐层查找,会发现一个images列表,里面的thumburl字段就是图片的真实地址(试试复制这个地址到浏览器,能直接打开图片哦~)。
  3. 记录请求 URL 和参数:每个请求都有一个 URL(如https://image.baidu.com/search/acjson?...),里面的word参数是搜索关键词(如 “刘亦菲”),pn是分页参数(控制第几页),rn是每页图片数量 —— 这些参数能帮我们控制爬取的内容和数量。

选择Fetch/XHR,里面放的是各种请求

2.5.1Header

在Header中往下滑,在request headers中找到 user-agent

         user-agent;用户代理”,是一个在客户端(如浏览器、APP、爬虫程序等)向服务器发送请求时,包含在 HTTP 请求头中的字符串。它的核心作用是向服务器 “说明” 自己的身份信息,让服务器了解请求来自哪种客户端、操作系统、设备类型等,从而返回适配的内容。

        user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 

2.5.2 Payload

2.5.3Preview

点击Preview 里面放的是我们请求的数据,我们需要在里面找到图片地址

        可以看出images是一个列表list 

2.5.3.1在images中找到图片地址

例如jumpUrl

结果如下

 继续往下找

结果如下 

然后换一个 继续访问看是否一致

结果如下,很显然thumburl就是我们要找的地址 ,同时从这里也可以看出每个请求里有30张图片

 2.5.4获取请求的url地址

 这样我们就获得了一个请求地址(访问不同地址不同):

https://image.baidu.com/search/acjson?tn=resultjson_com&word=%E5%88%98%E4%BA%A6%E8%8F%B2&ie=utf-8&fp=result&fr=&ala=0&applid=11719931000699796610&pn=60&rn=30&nojc=0&gsm=3c&newReq=1

3.编写爬虫代码:从请求到下载图片

        我这里使用pycharm

3.1打开pycharm

 3.2设置地址变量(url)

        设置一个变量来保存url地址,这里的地址应该是动态的,因为图片的地址不一样,后续会处理

3.2设置请求头:模拟浏览器

  • 请求头的作用User-Agent告诉网站 “我是浏览器”,避免被识别为爬虫而拒绝请求。

 3.3使用request模块发送请求

3.3.1检查是否 请求成功

3.3.2看看是否抓取到信息 

3.3.3然后查看文件类型 

 3.3.4将其转换为json

   json.loads() 是 Python 标准库 json 模块中的一个重要函数,用于将 JSON 格式的字符串转换为 Python 数据类型(如字典、列表、字符串、数字等),实现 JSON 数据的 “反序列化”,方便我们提取图片地址。。

3.4获取图片信息

        根据我们分析网页时(在分析网页模块2.5.3Preview 里面放的是我们请求的数据,我们需要一层一层的在里面找到图片地址)url地址get( )  方法获取

 3.4.1打印thumburl地址

 我们拿到图片地址就是想把它下载到本地

3.5下载图片

        创建一个用于存放图片的文件夹这里我创建的是images        

3.5.1使用request发起请求get(图片地址)

3.5.2 下载

3.5.2.1查看是否获取到图片数据
  • 二进制保存:图片是二进制文件,所以用"wb"模式(写入二进制)打开文件。

显然获取数据成功 

3.5.2.2保存图片数据

 注意:这里的地址D:\hqyj\py\周末自习\images要用  \ \,在python中 \ 是转义字符

3.5.3运行

 到这里我们就完成了简单的下载功能

4.代码优化:让爬虫更实用

4.1获取当前目录地址

结果如下: 

        D:\hqyj\py\周末自习
        D:\hqyj\py\周末自习\images

4.1.1不同方法

场景推荐方法原因
将图片保存到脚本所在目录os.path.dirname(__file__)无论脚本从何处运行,都能准确定位到脚本自身所在的目录。
将图片保存到当前工作目录os.getcwd()适用于需要与用户当前操作目录保持一致的场景(如命令行工具)。

4.1.2检测

4.2 优化下载数量

        从(2.5.2 点击Payload)中我们可以看出pn时为了设置每页起始值,而rn是每页图片张数,通过修改 URL 中的pn参数(分页起始值),实现多页爬取:如下:

注意,为了方便操作这里使用了换行符 \

由于这里做了更改,保存图片是的文件名也需更改 

然后执行看是否成功

显然是成功的 

4.3支持多关键词爬取,同时下载不同的内容

(2.5.2 点击Payload)可以发面word是用来存储我们搜索的关键词

我们可以用一个列表存储这些关键词来映射,动态获取内容

同样的我们需要对文件保存做出修改

运行看是否成功

 

 显然这是成功的两页,每页3张

4.4增加错误处理

       用try-except捕获错误,避免因个别图片地址无效导致程序崩溃:

5.源代码

import os
import requests
import json# 关键词映射
keyword = {'liuyifei': '刘亦菲','liushishi': '刘诗诗'
}
# 本地目录获取,当前文件所在目录
CURRENT_DIR = os.path.dirname(__file__)
PAGES_NUM = 2
if __name__ == '__main__':for key, word in keyword.items():# 下载图片到本地目录folder = os.path.join(CURRENT_DIR, key)if not os.path.exists(folder):os.makedirs(folder)# 遍历的方式爬取多页for page in range(PAGES_NUM):url = f'https://image.baidu.com/search/acjson?tn=resultjson_com&word={word}&ie=\utf-8&fp=result&fr=&ala=0&applid=11719931000699796610&pn={page*3}&rn=3&nojc=0&gsm=3c&newReq=1'# 设置请求头:模拟浏览器headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36'}# 使用request模块发送请求response = requests.get(url, headers=headers)images = json.loads(response.text).get('data').get('images')# 获取到所有的我要加载到本地的图片地址for i, img_info in enumerate(images):try:imgUrl = img_info.get('thumburl')if not imgUrl:continue  # 跳过无地址图片# 下载图片到本地# request发起请求,get(图片地址)img = requests.get(imgUrl)with open(os.path.join(folder, f'{word}{i+3*page}.jpg'), mode='wb') as f:f.write(img.content)print(f'第{page}页:{word}{i+page*3}.jpg 保存成功....')except Exception as e:print(f'第{page}页:{word}{i+page*3}.jpg 保存错误:{e}')

6总结

核心步骤回顾

  1. 分析网站:用开发者工具找到图片的请求 URL 和数据结构(关键是找到图片真实地址)。
  2. 发送请求:用requests库模拟浏览器发送请求,获取数据。
  3. 提取信息:从返回的 JSON 数据中提取图片地址。
  4. 保存数据:将图片以二进制形式保存到本地文件夹。
  5. 优化扩展:支持多页、多关键词爬取,增加错误处理。

注意事项

  • 尊重网站规则:查看网站的robots.txt(如https://image.baidu.com/robots.txt),遵守爬取限制,不要频繁请求(可以加time.sleep()控制间隔)。
  • 反爬应对:设置合理的请求头(User-Agent),避免被识别为爬虫;不要一次性爬取过多数据。
  • 合法性:确保爬取的内容用于学习,不侵犯版权或用于商业用途

        通过这篇教程,你已经掌握了 Python 爬取网页图片的基本方法。爬虫的核心是 “分析网站→模拟请求→提取数据”,多练习不同的网站(如豆瓣图片、壁纸网站),你会越来越熟练!

http://www.lryc.cn/news/594439.html

相关文章:

  • Selenium 处理动态网页与等待机制详解
  • 复杂度优先:基于推理链复杂性的提示工程新范式
  • AUTOSAR进阶图解==>AUTOSAR_SWS_CryptoInterface
  • 【Java学习|黑马笔记|Day18】Stream流|获取、中间方法、终结方法、收集方法及其练习
  • 扩散模型与强化学习(12):RLHF中的Reward hacking现象
  • 深入解析Ext2文件系统架构
  • 【RK3576】【Android14】ADB工具说明与使用
  • 【Linux性能优化】常用工具和实战指令
  • 软件测试-Bug
  • 【软件测试】从软件测试到Bug评审:生命周期与管理技巧
  • 机器学习-数据预处理
  • 0401聚类-机器学习-人工智能
  • Vue开发前端报错:‘vue-cli-service‘ 不是内部或外部命令解决方案
  • 交通出行大前端与 AI 融合:智能导航与出行预测
  • Servlet 执行流程 生命周期 方法介绍
  • 超大整数任意进制之间在线转换工具
  • 通俗易懂神经网络:从基础到实现
  • Unity 新旧输入系统对比
  • 【数据结构】树状数组
  • 网安-文件上传-upload-labs
  • 深入理解MyBatis:总结核心概念
  • Mermaid 语法
  • SpringBoot集成Skywalking链路跟踪
  • 44.sentinel授权规则
  • Dev-C++——winAPI贪吃蛇小游戏
  • codepen使用
  • 网鼎杯2020青龙组notes复现
  • AG32:解锁MCU+FPGA应用新姿势,功能与实战全解析
  • 《杜甫传》读书笔记与经典摘要(一)
  • 桑科草原一景