目 录CONTENT

文章目录

Scrapy 入门_实战妹子图全站图片下载

小张的探险日记
2021-09-07 / 0 评论 / 0 点赞 / 643 阅读 / 1,910 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2023-02-09,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Scrapy 入门_实战妹子图全站图片下载


1.爬虫需求

​ 爬取妹子图全站图片,宅男福利大放送!!!

​ 每个系列分目录存放

2. 实现效果

image-20210516234105793

image-20210516234137659

3.爬虫设计

​ 一共有263页,页数先直接写死。

​ html 分析,我们要爬取的内容在 ul id='pins' 的li 标签内

​ xpath 表达式 定位到 ul,循环遍历即可,遍历玩一整页后 判断是否还有下一页,如果有那么翻页继续爬。

image-20210516234644442

​ 代码编写

    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小时左右,一秒钟看一张 都得看好久 img

image-20210517235429155

一到夏天各种困img,需要坚持。

世界上那些最容易的事,拖延时间最不费力。

img

0

评论区