注:本文仅作参考所有操作均为示范,如有侵权请联系删除
前言
本文演示案例网站见代码
示例版块为“4k美女”,选此版块原因只因编者个人爱好,无不良导向。
一、查看robots.txt协议
在使用爬虫之前,务必首先查看目标网站的robots.txt,规范使用爬虫工具。
该网站爬虫协议如图
更多有关robots.txt协议可查看该博主文章:(6条消息) 查看网站的爬虫协议,简单介绍爬虫协议robots.txt,避免爬虫爬的好,牢饭吃得早(保姆级图文)_爬虫协议怎么看_发现你走远了的博客-CSDN博客
二、具体实现
1.引入库
代码如下:
import requests from lxml import etree import os
2.分析页面
首先观察页面,可以发现当前页面图片有限,若想查看更多图片则需执行翻页操作。通过实际操作不难发现,不同页面的url
其区别无非是_后的数字不同,其数字对应相应页面,而首页无_下划线,故选择从第二页往后爬起(这里我偷懒了我承认)。
清楚这一点后即可正式开始对图片src进行分析。
老规矩,右键——检查,可发现所有图片位于class为slist的div/ul/li中,那么以此为xpath即可获得当前页面图片所在li的一个列表
tree = etree.HTML(page_text)
image_list = tree.xpath('//div[@class="slist"]/ul/li')
再往下分析,展开li/a/img,可发现img两个属性"src"与"alt",对src进行抓取即可获得图片地址,对alt进行抓取即可获得图片的名称。
for li in image_list:
image_src = 'https://pic.netbian.com/' + li.xpath('./a/img/@src')[0]
image_name = li.xpath('./a/img/@alt')[0] + '.jpg'
理论存在,实践开始!
3.代码实现
首先手动进行请求头的伪装:
if __name__ == "__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.57'
}
还记得要对不同页面发送请求吗?在这里我们通过一个for循环来实现:
for i in range(2, 66):
url = f'https://pic.netbian.com/4kmeinv/index_{i}.html'
response = requests.get(headers=headers, url=url)
response.encoding = 'gbk' # 手动规定编码格式
page_text = response.text
tree = etree.HTML(page_text)
image_list = tree.xpath('//div[@class="slist"]/ul/li')
拿到当前页面的li列表后,就可以对它进行遍历分别拿到每张图片的信息,但是先别急 ,在此之前我们需要先确保图片存储到哪个文件夹中,在这里通过os实现:
if not os.path.exists('./4k美女(测试爬虫用!!!)'):
os.mkdir('./4k美女(测试爬虫用!!!)')
(我承认我心虚了,在文件夹名中标明测试爬虫用,被别人看到就不好了)
接下来就可以遍历列表,拿到img的两个属性src,alt去补全图片地址与名称
for li in image_list:
image_src = 'https://pic.netbian.com/' + li.xpath('./a/img/@src')[0]
image_name = li.xpath('./a/img/@alt')[0] + '.jpg'
image_data = requests.get(url=image_src, headers=headers).content
image_path = '4k美女(测试爬虫用!!!)/' + image_name
最后通过拿到的信息将图片以指定名称存入文件夹,并在成功存储后打印一条通过信息来获取进度。
with open(image_path, 'wb') as f:
f.write(image_data)
print(f"{image_name}下载成功")
4.总代码
总代码如下:
import requests
from lxml import etree
import os
if __name__ == "__main__":
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.57'
}
for i in range(2, 66):
url = f'https://pic.netbian.com/4kmeinv/index_{i}.html'
response = requests.get(headers=headers, url=url)
response.encoding = 'gbk' # 手动规定编码格式
page_text = response.text
tree = etree.HTML(page_text)
image_list = tree.xpath('//div[@class="slist"]/ul/li')
if not os.path.exists('./4k美女(测试爬虫用!!!)'):
os.mkdir('./4k美女(测试爬虫用!!!)')
for li in image_list:
image_src = 'https://pic.netbian.com/' + li.xpath('./a/img/@src')[0]
image_name = li.xpath('./a/img/@alt')[0] + '.jpg'
image_data = requests.get(url=image_src, headers=headers).content
image_path = '4k美女(测试爬虫用!!!)/' + image_name
with open(image_path, 'wb') as f:
f.write(image_data)
print(f"{image_name}下载成功")
5.实现效果
(背景有点花哨不好意思)
总结
进行爬虫活动前一定先确保查看robots.txt协议,并确保爬取的行为正当性,以免可刑。
更多关于爬虫内容请点击编者头像,就会发现其实就写了这一个