废话不多说,爬取妹子图片
使用scrapy深度爬取,抓取妹子图全站图片
1.首先确认开发环境
使用scrapy框架,Python3.6
创建scrapy项目meizitu-scrapy
spiders文件夹里为自己创建的爬虫文件
run.py为定义的启动scrapy 命令文件
2. 开发爬虫
首先定义item ,确定自己爬取的数据类型
开始开发爬虫
由于我们要抓取全站图片,所以使用深度爬取,爬虫继承的类为crawlspider
这主要是确定爬虫的爬取起始网址和界限爬取的网址,
定义链接提取规则,scrapy封装的函数会将提取的链接加入爬取队列。解析筛选数据由callback调用的parse_item处理,此处不能使用parse,重点说明!!!!不能parse函数!!这是CrawlSpider进行匹配调用的函数,你要是使用了!rules就没法进行匹配啦!!
这是妹子图的单独一页,每页都有一个列表,单独一个图集里含有图集所有图片,之前链接提取的就是下面分页的链接。
接下来做的就是将得到的页面解析,得到图集的名称和图集的链接,也就是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传递的时候深度拷贝值,不是在接收的时候拷贝。
到此,已经能将获得的数据获得到。接下来就是数据存储或者将把图片弄回本地。
暂时到此,下次再说存储数据库和下载图片到本地。