注意事项
爬虫有风险,爬取需谨慎。在爬取网站公开数据前,我们需要好好了解相关法律。
- 禁止爬取含个人隐私信息的内容
- 不得干扰目标网站正常服务(触发DDoS可能构成刑事犯罪)
- 商业用途需获得著作权人书面授权
- 敏感数据跨境传输需通过安全评估
建议大家在爬取前检查目标网站的robots.txt 并设置合理延时(建议2-5秒/请求)
分析网页
首先我们来到目标网站,选择古风分类。可以看到这里有很多漂亮的古风小姐姐图片,当然,每个图集只能看到部分图片,其他的需要收费,我们的目标就是能看到的小姐姐图片。

按下F12,分析网页结构,点击实时插找的小鼠标,查看图集所在的链接结构。

可以看到该网页的结构很简单,a标签所在的就是图集的链接,点击该链接就进入图集了。

所以接下来就是提取本页面所有图集的a标签链接,只要获取到了本页的所有图集链接,就可以进入到每个图集,爬取每个图集的图片了。
获取图集链接
首先安装requests 和 lxml库。
pip install requests lxml
在python文件中,开始构建基础的请求头,并使用requests访问网页,然后根据网页结构,写出获取图集a标签的xpath法则,代码如下:
import requests
from lxml import html
# 配置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
# 请求起始页
start_url = 'https://www.yituyu.com/tag/12/'
response = requests.get(start_url, headers=headers)
# 提取图集链接
tree = html.fromstring(response.text)
album_links = tree.xpath('//*[@class="databox"]/li/div/a/@href')
print(f'共找到{len(album_links)}个链接!')
最后的结果是这样的:

一共找到30个链接,我们回到网页看看,这一页的确是30个图集。如果需要进一步确认,可以复制第一个或最后一个进入测试一下。
这样,我们就把该页的图集链接获取完毕了。
获取图集内容
在得到了以上的图集链接后,我们就可以使用for循环,逐个访问每个图集,并提取图集的标题和图片了。
首先我们进入一个图集,按下F12分析其网页结构,标题的结构如下:

根据标题,我们可以轻易写出xpath法则为:
//title/text()
然后再看图片链接的法则:

可以清晰地看见,img标签在一个类gallerypic中,所以图片法则有了:
//*[@class="gallerypic"]/img/@data-src
这样我们继续代码,注意记得增添访问延迟:
for link in album_links:
#设置访问延迟
time.sleep(2.5)
#访问具体的图集页链接
album_response=requests.get(link, headers=headers)
album_tree = html.fromstring(album_response.text)
title = album_tree.xpath('//title/text()')[0].strip()
img_urls = album_tree.xpath('//*[@class="gallerypic"]/img/@data-src')
print(title)
print(img_urls)
此时,我们就可以在控制台看见标题和图片链接的列表输出啦!

存储数据
图片标题有了,图片链接也有了,下面我们就可以将图片保存下来啦!
第一种方式,把所有的图片链接保存到一个txt文档中,然后打开迅雷下载器,把所有的链接复制进去,点击下载即可!
这种方式,缺点就是每次下载需要动手,优点就是一次可以下载很多,且不用担心程序出错导致中断下载,非常适合某些大文件。
如果采用这种方法,我们直接用代码将图片链接保存到一个txt文档即可:
for img in img_urls:
# 存储结果
with open('image_links.txt', 'a+') as f:
f.write(img)
f.write('\n')
f.close

然后就是打开迅雷,把链接复制进去即可下载。
然后就是自己写代码下载,由于我们想要把每个图集的图片保存到以该图集标题文件夹名的文件夹中,所以需要先创建一个以标题title为名的文件,然后再进行图片下载:
os.makedirs(title)
for img in img_urls:
#设置图片名
pic_name=img.split('/')[-1]
#访问图片链接,获得二进制数据
content=requests.get(img, headers=headers).content
#存入图片
with open(f'{title}/{pic_name}','wb')as f:
f.write(content)
f.close()
print(f'{pic_name}下载完成!')
当然,这个代码的健壮性不强,需要设置更多的错误处理。不过下载我们今天这个网站的图片已经足够了。
我们可以看看下载的图片:


最后附上完整代码:
import requests
from lxml import html
import time
import os
# 配置请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
# 请求起始页
start_url = 'https://www.yituyu.com/tag/12/'
response = requests.get(start_url, headers=headers)
# 提取图集链接
tree = html.fromstring(response.text)
album_links = tree.xpath('//*[@class="databox"]/li/div/a/@href')
print(album_links)
print(f'共找到{len(album_links)}个链接!')
for link in album_links:
#设置访问延迟
time.sleep(2.5)
#访问具体的图集页链接
album_response=requests.get(link, headers=headers)
album_tree = html.fromstring(album_response.text)
title = album_tree.xpath('//title/text()')[0].strip()
img_urls = album_tree.xpath('//*[@class="gallerypic"]/img/@data-src')
print(title)
print(img_urls)
os.makedirs(title)
for img in img_urls:
#设置图片名
pic_name=img.split('/')[-1]
#访问图片链接,获得二进制数据
content=requests.get(img, headers=headers).content
#存入图片
with open(f'{title}/{pic_name}','wb')as f:
f.write(content)
f.close()
print(f'{pic_name}下载完成!')
print('本页面图集下载完成啦!')