【超详细,适合新手】Python 爬虫实战:逐行解析10 wallpaper 壁纸批量下载器
下面是一个简单的爬虫实例,这个爬虫的目标是抓取一个壁纸网站,提取并保存每张壁纸
首先,确保你已经安装了requests和lxml库。如果没有安装,可在终端或者pycharm中输入下面这串代码安装:
pip install requests
pip install lxml
安装好lxml库后,就可以在Python代码中通过from lxml import etree来导入etree模块,并使用它提供的各种功能,然后我们就可以编写以下爬虫脚本:
import fake_useragent
import requests
from lxml import etree
import os
n=0
def count():
global n
n+=1
return n
if not os.path.exists("./Picture"):
os.mkdir("./Picture")
head = {
"User-Agent": fake_useragent.UserAgent().random
}
for i in range(1,3):
url = f'https://10wallpaper.com/List_wallpapers/page/{i}'
resp = requests.get(url, headers=head)
result = resp.text
tree = etree.HTML(result)
p_list = tree.xpath("//div[@id='pics-list']/p")
for p in p_list:
img_url = p.xpath("./a/img/@src")[0]
img_url2='https://10wallpaper.com'+img_url
print(img_url2)
img_name = count()
print(img_name)
img_resp = requests.get(img_url2, headers=head)
img_content = img_resp.content
with open(f"./Picture/{img_name}.jpg", "wb") as fp:
fp.write(img_resp.content)
下面我将逐行的对代码进行解析,力求每位观看的人都可理解透彻
首先我们需要引入我们下载好的fake_useragent 库和 requests库。
fake_useragent 库在这里的作用是生成随机的浏览器标识,目的就是“骗”过网站,让它认为我们是真人,而不是一个爬虫程序,同时也是确保我们爬虫得到的图片完整,没有损坏。
import os目的是导入系统库:用来创建文件夹、判断文件路径
import fake_useragent
import requests
from lxml import etree
import os
接下来我们定义一个全局变量,用来给我们爬取得到的图片进行编号,同时我们定义了一个计数函数,每当被调用一次,编号+1,这样就保证了图片排序的稳定性。
n=0
def count():
global n
n+=1
return n
判断当前文件夹下是否存在名为 Picture 的文件夹,如果不存在,就创建该文件夹,用于保存图片
if not os.path.exists("./Picture"):
os.mkdir("./Picture")
这时候我们在进行重要的一步,生成一个浏览器标识,避免我们爬取到的图片不完整,“骗”过网站,避免被察觉到我们是一个爬虫脚本。
注:如果不引用 fake_useragent 库,则需要我们在网站页面按下F12按钮,进入开发者模式,获取User-Agent,以bilibili网站为例:
head = {
"User-Agent": fake_useragent.UserAgent().random
}
设定一个for循环,循环爬取第1页、第2页(range(1,3) = 1,2),同时拼接每一页的网址,动态翻页。
如果我们有需要,将范围扩大,就可以满足我们对图片量的需求。
for i in range(1,3):
url = f'https://10wallpaper.com/List_wallpapers/page/{i}'
我们使用 requests.get() 方法向壁纸网站的分页地址发送 HTTP 请求。
这个过程相当于模拟浏览器访问网页,服务器会根据我们的请求,返回对应页面的完整响应内容,其中就包含了页面所有的 HTML 结构、文本、图片链接等信息,这是爬虫获取数据的第一步,也是最基础的一步。
将服务器返回的响应内容解析为文本格式(网页源代码)
服务器返回的响应是一个二进制数据流,我们通过 .text 属性将其转换为字符串格式的网页源代码。
这段源代码就是我们在浏览器中 “检查” 看到的 HTML 内容,包含了所有图片、文字、链接的原始结构,是后续解析数据的基础。只有将响应转为文本字符串,才能进行下一步的 XPath 解析。
resp = requests.get(url, headers=head)
result = resp.text
tree = etree.HTML(result)
使用XPath提取所有图片所在的标签,通过对页面的元素进行检查,获取图片的标签
p_list = tree.xpath("//div[@id='pics-list']/p")
遍历每一个图片所在标签节点,循环逐个拿到包裹图片的 HTML 标签元素;
利用 XPath 语法,在当前单个标签节点内部,精准查找子级 img 图片标签,并提取其src 属性值,也就是图片的相对路径地址;
由于提取到的地址只是相对路径,并不是可以直接访问的完整网络链接,缺少网站主域名部分;
所以需要进行地址拼接,把网站根域名和图片相对路径组合在一起,合成能够直接浏览器访问、可以直接发起下载请求的完整高清图片 URL 地址。
# 遍历每一个图片所在标签
for p in p_list:
# 从当前标签中提取 img 标签的 src 属性(图片链接)
img_url = p.xpath("./a/img/@src")[0]
# 拼接完整图片地址(网站域名 + 图片相对路径)
img_url2='https://10wallpaper.com'+img_url
打印拼接完成后的完整图片链接,方便我们在控制台实时查看爬取到的图片地址,同时也能用来校验链接是否有效、格式是否正确。
调用自定义的计数函数,自动获取自增的图片序号,作为每张图片的保存文件名。再打印当前图片的排序编号,直观展示当前正在下载第几张图片,让整个爬取过程进度清晰可见,方便程序调试和运行状态观察。
# 打印完整图片链接,方便查看
print(img_url2)
# 调用计数函数,获取图片编号
img_name = count()
# 打印当前是第几张图片
print(img_name)
向拼接好的完整图片地址发起网络请求,发起下载图片资源的操作;
从请求响应结果中,获取图片二进制字节数据,这才是图片真正的原始文件内容,并不是文字文本。
以创建并打开本地文件的方式,采用二进制写入模式来操作文件,避免图片格式损坏、乱码失效;
最后把获取到的图片二进制字节数据写入到本地文件中,写入完成后自动关闭文件,整张壁纸图片就成功保存到本地文件夹中,完成整张图片的下载与存储全过程。
# 发送请求,下载图片
img_resp = requests.get(img_url2, headers=head)
# 获取图片的二进制数据(真正的图片内容)
img_content = img_resp.content
# 打开文件,以二进制写入模式保存图片
with open(f"./Picture/{img_name}.jpg", "wb") as fp:
# 将图片数据写入文件,完成保存
fp.write(img_resp.content)
本文以壁纸网站为爬取目标,从第三方库安装、模块导入、文件夹创建、请求头伪装,到网页请求、源码解析、XPath 节点定位,再到图片链接提取、地址拼接、进度打印、图片二进制下载与本地保存,把爬虫发送请求 — 解析页面 — 提取链接 — 下载存储的完整流程全部梳理清楚。
整篇文章没有晦涩难懂的专业术语,尽量用通俗直白的语言讲解每一行代码的作用与底层逻辑,目的就是让爬虫新手也能看懂每一步原理,不只是单纯复制代码运行,更能理解背后的实现思路、XPath 定位技巧、反爬伪装方式以及图片二进制保存的核心知识点,真正做到看懂代码、吃透原理、举一反三,后续可以套用这套思路去爬取其他同类图片网站,扎实掌握入门爬虫的实战能力。
如果这篇文章对你有帮助,请点个赞和收藏,博主会继续努力更新文章的。
更多推荐
所有评论(0)