scrapy爬取妹子图

废话不多说,爬取妹子图片
使用scrapy深度爬取,抓取妹子图全站图片

1.首先确认开发环境

使用scrapy框架,Python3.6
创建scrapy项目meizitu-scrapy

项目结构

spiders文件夹里为自己创建的爬虫文件
run.py为定义的启动scrapy 命令文件

2. 开发爬虫

首先定义item ,确定自己爬取的数据类型


items.py

开始开发爬虫
由于我们要抓取全站图片,所以使用深度爬取,爬虫继承的类为crawlspider


使用的模块
定义爬虫类,定义属性

这主要是确定爬虫的爬取起始网址和界限爬取的网址,
定义链接提取规则,scrapy封装的函数会将提取的链接加入爬取队列。解析筛选数据由callback调用的parse_item处理,此处不能使用parse,重点说明!!!!不能parse函数!!这是CrawlSpider进行匹配调用的函数,你要是使用了!rules就没法进行匹配啦!!


妹子图的界面

这是妹子图的单独一页,每页都有一个列表,单独一个图集里含有图集所有图片,之前链接提取的就是下面分页的链接。
接下来做的就是将得到的页面解析,得到图集的名称和图集的链接,也就是parse_item的主要任务。

parse_item函数

此处通过xpath得到列表,在for循环得到每个图集的数据,将其封装到item对象。由于我们需要进一步获取图集的每张图片的链接,所以需要再次爬取,爬取图集链接,得到具体页面的所有图片链接。
此处调用img-url函数处理爬取的结果,由于需要传递数据,
此处参考了Scrapy抓取在不同级别Request之间传递参数文章。
流程是这样的:
传递数据流程

图片链接获取
处理得到数据

在这里遇到一个问题:

得到封装的数据

如上图所示,得到封装后的数据。点击却发现得到的image_urls与name和URL不是一个对应的图集的,数据封装产生了混淆。如何解决呢???
。。。。。。。。。。。。。。。。。。。。
就是百度。
在CSDN 得到了解决,有人说是参数传递问题


参数说明

这是由于传递的item是浅拷贝,造成数据没有隔离,需要深拷贝来将数据隔离,避免产生混淆。使用深拷贝,保证内容的独立性。

import copy
yield Request(url,meta={'item':copy.deepcopy(item)},callback=self.img_url)

深度拷贝 copy.deepcopy(),而且copy是在yield传递的时候深度拷贝值,不是在接收的时候拷贝。
到此,已经能将获得的数据获得到。接下来就是数据存储或者将把图片弄回本地。
暂时到此,下次再说存储数据库和下载图片到本地。

你可能感兴趣的:(scrapy爬取妹子图)