scrapy爬取妹子图
废话不多说,爬取妹子图片
使用scrapy深度爬取,抓取妹子图全站图片
1.首先确认开发环境
使用scrapy框架,Python3.6
创建scrapy项目meizitu-scrapy
![](https://img.haomeiwen.com/i6905175/244ab68fcd3a49d5.png)
spiders文件夹里为自己创建的爬虫文件
run.py为定义的启动scrapy 命令文件
2. 开发爬虫
首先定义item ,确定自己爬取的数据类型
![](https://img.haomeiwen.com/i6905175/dddd4e839875dc8f.png)
开始开发爬虫
由于我们要抓取全站图片,所以使用深度爬取,爬虫继承的类为crawlspider
![](https://img.haomeiwen.com/i6905175/3d51e557148a50c7.png)
![](https://img.haomeiwen.com/i6905175/d2d8fb6d70776194.png)
这主要是确定爬虫的爬取起始网址和界限爬取的网址,
定义链接提取规则,scrapy封装的函数会将提取的链接加入爬取队列。解析筛选数据由callback调用的parse_item处理,此处不能使用parse,重点说明!!!!不能parse函数!!这是CrawlSpider进行匹配调用的函数,你要是使用了!rules就没法进行匹配啦!!
![](https://img.haomeiwen.com/i6905175/ec06e4af0741b08a.png)
这是妹子图的单独一页,每页都有一个列表,单独一个图集里含有图集所有图片,之前链接提取的就是下面分页的链接。
接下来做的就是将得到的页面解析,得到图集的名称和图集的链接,也就是parse_item的主要任务。
![](https://img.haomeiwen.com/i6905175/065cef483a55dc51.png)
此处通过xpath得到列表,在for循环得到每个图集的数据,将其封装到item对象。由于我们需要进一步获取图集的每张图片的链接,所以需要再次爬取,爬取图集链接,得到具体页面的所有图片链接。
此处调用img-url函数处理爬取的结果,由于需要传递数据,
此处参考了Scrapy抓取在不同级别Request之间传递参数文章。
流程是这样的:
![](https://img.haomeiwen.com/i6905175/6846cc0bd683e13a.png)
![](https://img.haomeiwen.com/i6905175/bf7220307b99d516.png)
在这里遇到一个问题:
![](https://img.haomeiwen.com/i6905175/522c6ecfc43361dc.png)
如上图所示,得到封装后的数据。点击却发现得到的image_urls与name和URL不是一个对应的图集的,数据封装产生了混淆。如何解决呢???
。。。。。。。。。。。。。。。。。。。。
就是百度。
在CSDN 得到了解决,有人说是参数传递问题
![](https://img.haomeiwen.com/i6905175/a14e3f64f88bb5d5.png)
这是由于传递的item是浅拷贝,造成数据没有隔离,需要深拷贝来将数据隔离,避免产生混淆。使用深拷贝,保证内容的独立性。
import copy
yield Request(url,meta={'item':copy.deepcopy(item)},callback=self.img_url)
深度拷贝 copy.deepcopy(),而且copy是在yield传递的时候深度拷贝值,不是在接收的时候拷贝。
到此,已经能将获得的数据获得到。接下来就是数据存储或者将把图片弄回本地。
暂时到此,下次再说存储数据库和下载图片到本地。