欢迎光临
我们一直在努力

BeautifulSoup爬虫实战:批量下载图片

标签:#Python爬虫 #BeautifulSoup #requests #图片爬虫 #网页解析 阅读时长:10min | 适用人群:爬虫零基础、Python初学者

一、前言&合规提醒

1.项目简介

本文基于BeautifulSoup4 实现经典二级页面爬虫:列表页→详情页→提取图片链接→批量下载本地,以COS图集静态网页为实战案例,完整还原爬虫标准开发流程:抓网页→解析HTML→链接拼接→二进制保存图片,是新手入门BS爬虫最优练手项目。

2.爬虫法律&合规提醒

1. 仅用于个人技术学习,禁止商用、批量大规模爬取、恶意压测网站服务器; ​ 2. 遵守网站 robots.txt 协议,控制请求间隔,不高频并发请求; ​ 3. 爬取内容仅限学习用途,不传播、盗用网站版权图片,违规后果自行承担。

二、技术栈介绍

作用
requests HTTP请求库,模拟浏览器访问网页,获取HTML源码、下载图片二进制流
beautifulsoup4 HTML/XML解析库,精准定位页面标签、提取链接、筛选数据
Python内置open 以二进制模式写入,保存图片到本地

环境安装 打开终端执行pip安装依赖:

pip install requests beautifulsoup4

三、爬虫业务流程

爬虫采用两级抓取架构,流程分4步:   1. 一级列表页请求:访问COS图集分类页,获取全部图集入口 <li> 列表; ​ 2. 解析详情页链接:BS筛选 class="i_list list_n2" 标签,提取子页面相对href; ​ 3. 拼接完整URL:域名+相对路径生成详情页绝对地址,循环访问每个图集详情; ​ 4. 详情页提取图片:解析详情页 image_div 容器内img标签,拿到图片源地址,二进制下载保存

本地jpg文件。

四、网页结构分析

1.列表页结构

目标URL:COS图集_COS套图_COS高清图片 – 优美图录    所有图集条目统一存放于 <li class="i_list list_n2"> ; ​ 每个li内部 <a> 标签 href 是相对路径,需要拼接域名优美图录 – 专注超高清美女图片分享网站 变成完整URL;

2.详情页结构

图集图片固定包裹在 <div class="image_div"> 内部的 <img> 标签; ​ <img src="图片完整URL"> 即为原图下载地址,直接GET请求即可获取图片资源。   开发技巧:写代码前优先F12查看网页DOM结构,确定标签名、class类名,是BS爬虫关键步骤。

五、可运行代码

5.1 分步代码讲解

① 导入依赖、配置基础域名

import requests
from bs4 import BeautifulSoup

domain = "https://www.umei.net"
url = "https://www.umei.net/tags/cos/"
resp = requests.get(url)
resp.encoding = "utf-8"
print(resp.text)

运行结果:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="initial-scale=1.0,user-scalable=no">
<title>COS图集_COS套图_COS高清图片 – 优美图录</title>
<meta name="keywords" content="COS,COS图集_COS套图_COS高清图片">
<meta name="description" content="COS的超清图片是由优美图录提供,为用户提供与COS相关的图片欣赏/套图下载…">
<link rel='stylesheet' id='style-css' href='/static/umei/css/style.css?ver=2023.05.27' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='/static/umei/css/font-awesome.min.css?ver=1.0' type='text/css' media='all' />
<script type='text/javascript' src='/static/umei/js/jquery.js?ver=1.1'></script>
<!–[if lt IE 9]> <script src="/static/umei/js/html5shiv.min.js"></script> <![endif]–>
</head>
<body class="home blog" >
<div class="index_header" id="nav">
<div class="header_inner">
<div class="logo"> <a href="/"><img src="/static/umei/images/logo.png" alt="美图录" /></a> </div>
<div class="header_menu">
<ul>
<li class=" "><a href="/">首页</a></li>
<li class=" "><a href="/i/">最新</a></li>
<li class=" "><a href="/model/">模特</a></li>
<li class=" megamenu toke current-menu-item"><a href="#">热门标签</a>
<ul class="sub-menu"><li><a href="https://www.meitule.com/tags/wangluomeinv/">网络美女</a></li>
<li><a href="/tags/qingchun/">清纯</a></li>

<!–首页幻灯片–>
</body>
</html>

② 请求列表页,生成BS解析对象

③ 批量查找所有图集li标签

main_page = BeautifulSoup(resp.text, "html.parser")
a_list = main_page.find_all("li", attrs={"class": "i_list list_n2"})

BS核心方法: find() :查找第一个匹配标签; ​find_all() :查找全部匹配标签,返回列表,循环遍历。

④ 循环遍历、进入详情页、下载图片

n=1

#遍历每个图集,拼接URL、请求子页面、下载图片
for li in a_list:
# 从父标签li中提取a标签,再拿href(视频风格:先提取标签,再拿属性)
a_tag = li.find("a")
href = a_tag.get("href") # 提取相对路径href
child_url = domain + href
#print(f"正在请求子页面:{child_url}")
child_resp = requests.get(child_url)
child_resp.encoding = "utf-8"
child_bs = BeautifulSoup(child_resp.text, "html.parser")
img_tag = child_bs.find("div", class_="image_div").find("img")
img_src = img_tag.get("src")
#print(img_src)
img_resp = requests.get(img_src)
with open(f"{n}.jpg",mode="wb") as f:
f.write(img_resp.content)
print(f"{n}图片下载完毕")
n+=1

六、运行效果&结果说明

1. 运行代码后,项目根目录存放有下载图片; ​ 2. 控制台逐行打印

1图片下载完毕
2图片下载完毕
3图片下载完毕
4图片下载完毕
5图片下载完毕
6图片下载完毕
7图片下载完毕
8图片下载完毕
9图片下载完毕
10图片下载完毕
11图片下载完毕
12图片下载完毕
13图片下载完毕
14图片下载完毕
15图片下载完毕
16图片下载完毕
17图片下载完毕
18图片下载完毕
19图片下载完毕
20图片下载完毕
21图片下载完毕
22图片下载完毕
23图片下载完毕
24图片下载完毕
25图片下载完毕

七、存在的问题&优化点

原代码缺陷 优化方案
无User-Agent请求头,极易被服务器识别爬虫拦截 添加浏览器UA请求头 无异常捕获,页面标签缺失直接报错崩溃
无异常捕获,页面标签缺失直接报错崩溃 try-except全局捕获并且标签判空
图片直接保存在项目根目录,杂乱 os自动新建专属文件夹统一存放
无超时限制,网络卡顿永久阻塞  requests添加timeout超时参数
无空标签判断,部分页面缺图导致程序报错 if判空,找不到标签直接跳过当前条目

八、进阶拓展方向

1. 分页爬取:识别页面下一页按钮,实现多页图集全量爬取; ​ 2. 延时防封:导入 time.sleep(1~2) ,每次请求休眠1秒,降低封禁概率; ​ 3. 文件名优化:提取图集标题作为图片文件名,不再使用数字序号; ​ 4. 多线程下载:引入 threading 实现异步并发下载,提升爬图速度; ​ 5. URL容错:使用 urllib.parse.urljoin 智能拼接相对/绝对链接,适配不规则路径。

九、常见踩坑

Q1:报错ModuleNotFoundError: No module named 'bs4'   A:未安装依赖,执行 pip install beautifulsoup4 requests 安装库。   Q2:页面中文乱码?   A: resp.encoding="utf-8" 手动指定编码,部分网页可用 resp.apparent_encoding 自动识别编码。   Q3:requests请求403/访问被拒绝?   A:网站开启基础反爬,缺少UA请求头,在headers中补充浏览器User-Agent。   Q4:图片打不开,文件损坏?   A:保存必须使用 wb 二进制模式,不能用 w 文本模式写入图片。

十、总结

本项目是BS4爬虫入门标杆案例,吃透后可迁移至壁纸、商品图、动漫图集等各类静态图片网站爬取。爬虫核心本质:拿源码+筛选标签+文件落地保存,掌握两级页面联动抓取逻辑,即可搞定80%静态网页图片爬虫。

 

赞(0)
未经允许不得转载:171主机测评 » BeautifulSoup爬虫实战:批量下载图片
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址