Scrapy 入门_实战妹子图全站图片下载
1.爬虫需求
爬取妹子图全站图片,宅男福利大放送!!!
每个系列分目录存放
2. 实现效果
3.爬虫设计
一共有263页,页数先直接写死。
html 分析,我们要爬取的内容在 ul id='pins' 的li 标签内
xpath 表达式 定位到 ul,循环遍历即可,遍历玩一整页后 判断是否还有下一页,如果有那么翻页继续爬。
代码编写
def parse(self, response):
pins = response.xpath('//*[@id="pins"]')
li_list = pins.xpath('li')
for li in li_list:
# 每个系列待下载的图片
wait_down_list = []
url = li.xpath('a/@href').extract_first()
title = li.xpath('.//span[1]/a/text()').extract_first()
time.sleep(1)
# dont_filter 设置参与去重
yield Request(url=url, callback=self.get_pic_url, meta={'title': title, 'wait_down_list': wait_down_list}
, dont_filter=False)
def get_pic_url(self, response):
title = response.meta['title']
wait_down_list = response.meta['wait_down_list']
img_url = response.xpath('/html/body/div[2]/div[1]/div[3]/p/a/img/@src').extract_first()
wait_down_list.append(img_url)
if response.xpath('//span[contains(text(),"下一页»")]/text()').extract_first() == '下一页»':
# 获取下一页的url
# 按照文本内容 查询对应的 元素,并获取 父级 的 href 属性。
next_url = response.xpath('//span[contains(text(),"下一页»")]/parent::*/@href').extract_first()
yield Request(url=next_url, callback=self.get_pic_url,
meta={'title': title, 'wait_down_list': wait_down_list}
, dont_filter=False)
else:
item = MeizituItem()
item['title'] = title
item['image_urls'] = wait_down_list
yield item
因为是 下载图片,Scrapy 本身就提供了 专门下载图片的 中间件 ImagesPipeline,但是ImagesPipeline 并不满足 这个爬虫的需求,它不能做到分目录存放 我们指定的图片,所有需要继承 ImagesPipeline 实现自己的 download_pic_pipeline,
1.重写 get_media_requests 自定义请求头解决 302 问题。
2.重写 file_path 解决每个目录分系列存放问题。
实验后发现 访问过快导致 网站不给返回,于是降低访问速率,就可以正常爬取,速度大小 需要自行尝试后设置,如果测试过程中被限制了访问,直接拔掉 光猫的电源重开, 即可获取新的IP 地址,就可以正常访问了,由此可见 代理IP 也是一个解决方式。
CONCURRENT_REQUESTS = 10
跑起来正常但是没有下载到图片的注意看启动时的日志:
意思就是系统中没有安装Pillow 4.0.0以上的版本,需要手动安装一下:
pip install pillow
2021-09-29 15:28:08 [scrapy.middleware] WARNING: Disabled download_pic_pipeline: ImagesPipeline requires installing Pillow 4.0.0 or later
2021-09-29 15:28:08 [scrapy.middleware] INFO: Enabled item pipelines:
爬取了大概8小时左右,一秒钟看一张 都得看好久
一到夏天各种困,需要坚持。
世界上那些最容易的事,拖延时间最不费力。
评论区