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传递的时候深度拷贝值,不是在接收的时候拷贝。
到此,已经能将获得的数据获得到。接下来就是数据存储或者将把图片弄回本地。
暂时到此,下次再说存储数据库和下载图片到本地。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 序言第1章 Scrapy介绍第2章 理解HTML和XPath第3章 爬虫基础第4章 从Scrapy到移动应用第5章...
    SeanCheney阅读 15,128评论 13 61
  • 最近看了一部电视剧《生逢灿烂的日子》,看到网上有很多吐槽,说成年后的演员年龄差距太大,而我就是冲着张嘉译来看的这部...
    默莞阅读 1,211评论 0 3
  • 今晨,老公帮忙照顾女儿吃早餐,女儿在餐椅上发出不愉快的腔调,由低到高,由弱渐强,我默默收拾着东西(一般老公主动要求...
    小依妈阅读 439评论 8 8
  • 考完研难得有这么闲散的时光,过年之前和妈妈一起回老家呆一个月,看看外公外婆。 赶上老家的第一场大雪,气温都能和我大...
    咸鱼爱虾米阅读 139评论 0 0