Python面试题分享(十四)

本文介绍了Scrapy框架的运行机制,包括start_requests()、调度器、下载器、解析方法以及数据处理流程。同时,讨论了如何在Scrapy中发送POST请求、检查网站更新以及数据去重的方法。还提到了Scrapy-Redis用于实现分布式爬虫的优势,如主从同步和内存存储,以及三种常见的分布式爬虫策略及其优缺点。

11. 描述下scrapy框架运行的机制?

1. 通过spiderstart_requests()方法,遍历start_urls构造Request请求,由引擎交给调度器入请求队列,

2. 调度器将请求队列里的请求交给下载器去获取请求对应的响应资源,并将响应交给指定的解析方法做提取处

理:

1. 如果提取出需要的数据,则交给管道文件处理;

2. 如果提取出Request对象,则将请求交给调度器,放入请求队列中

3. 重复2 过程,直到请求队列里没有请求,程序结束

12. 怎么样让 scrapy 框架发送一个 post 请求?

yield scrapy.FormRequest(

      url = url,

      formdata = {"email" : "xxx""password" : "xxxxx"}callback = self.parse_page )

13. 怎么判断网站是否更新?

使用 MD5 数字签名: 第一次请求指定url,把服务器返回的数据body进行MD5 数字签名 S1,下次请求相同ur

同理生成签名 S2,比较 S2 S1, 如果相同,则页面没有更新,否则网页就有更新

 

14. 爬虫向数据库存数据开始和结束都会发一条消息,是scrapy哪个模块实

现?

Scrapy使用信号来通知事情发生,是signals 模块。

15. 爬取下来的数据如何去重

1. 通过MD5生成电子指纹来判断页面是否改变

2. 数据量不大时,可以直接放在内存里面进行去重,python可以使用set进行去重。当去重数据需要持久化时可

以使用redisset数据结构

3. 当数据量再大一点时,可以用不同的加密算法先将长字符串压缩成 16/32/40 个字符,在利用set集合去重,

scrapy中对request对象的去重就是利用hashlib.sha1生成request指纹放入set中进行去重的

4. 当数据量达到亿(甚至十亿、百亿)数量级时,内存有限,必须用来去重,才能够满足需求。

Bloomfifilter(布隆过滤器)就是将去重对象映射到几个内存,通过几个位的 0/1值来判断一个对象是否已

经存在 ,之前在对新浪微博数据进行爬取的时候,对url的去重就是利用redis来去重,1G的内存大概实

80亿url的去重

16. scrapyscrapy-redis有什么区别?为什么选择redis数据库?

scrapy 是一个Python爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式。

scrapy-redis一套基于redis数据库、运行在scrapy 框架之上的组件,可以让scrapy 支持分布式策略,

Slaver端共享Master redis数据库里的item队列、请求队列和请求指纹集合。

为什么选择redis数据库,因为redis支持主从同步,而且数据都是缓存在内存中的,所以基于redis的分布式爬

虫,对请求和数据的高频读取效率非常高。

17. 你所知道的分布式爬虫方案有哪些?

三种分布式爬虫策略:

1. Slaver 端从 Master 端拿任务(Request/url/ID)进行数据抓取,在抓取数据的同时也生成新任务,并将任务

抛给 MasterMaster 端只有一个 Redis 数据库,负责对 Slaver 提交的任务进行去重、加入待爬队列。

优点: scrapy-redis 默认使用的就是这种策略,我们实现起来很简单,因为任务调度等工作 scrapy

redis 都已经帮我们做好了,我们只需要继承 RedisSpider、指定 redis_key 就行了。

缺点: scrapy-redis 调度的任务是 Request 对象,里面信息量比较大(不仅包含 url,还有 callback

数、headers 等信息),导致的结果就是会降低爬虫速度、而且会占用Redis 大量的存储空间。当然我

们可以重写方法实现调度 url 或者用户 ID

2. Master 端跑一个程序去生成任务(Request/url/ID)。Master 端负责的是生产任务,并把任务去重、加入到

待爬队列。Slaver 只管从 Master 端拿任务去爬。

优点: 将生成任务和抓取数据分开,分工明确,减少了 Master Slaver 之间的数据交流;Master

生成任务还有一个好处就是:可以很方便地重写判重策略(当数据量大时优化判重的性能和速度还是很

重要的)。

缺点: 像 QQ 或者新浪微博这种网站,发送一个请求,返回的内容里面可能包含几十个待爬的用户 ID

即几十个新爬虫任务。但有些网站一个请求只能得到一两个新任务,并且返回的内容里也包含爬虫要抓

取的目标信息,如果将生成任务和抓取任务分开反而会降低爬虫抓取效率。毕竟带宽也是爬虫的一个瓶

颈问题,我们要秉着发送尽量少的请求为原则,同时也是为了减轻网站服务器的压力,要做一只有道德

Crawler。所以,视情况而定。

3. Master 中只有一个集合,它只有查询的作用。Slaver 在遇到新任务时询问 Master 此任务是否已爬,如果未

爬则加入 Slaver 自己的待爬队列中,Master 把此任务记为已爬。它和策略一比较像,但明显比策略一简单。

策略一的简单是因为有 scrapy-redis 实现了scheduler 中间件,它并不适用于非 scrapy 框架的爬虫。

优点: 实现简单,非 scrapy 框架的爬虫也适用。Master 端压力比较小,Master Slaver 的数据交流

也不大。

缺点:健壮性不够,需要另外定时保存待爬队列以实现断点续爬功能。各 Slaver的待爬任务不通用。

如果把 Slaver 比作工人,把 Master 比作工头。策略一就是工人遇到新任务都上报给工头,需要 干活的时候

就去工头那里领任务;策略二就是工头去找新任务,工人只管从工头那里领任务干活;策略 三就是工人遇到

新任务时询问工头此任务是否有人做了,没有的话工人就将此任务加到自己的行程 表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值