scrapy-爬取策略

 

 

# 爬虫允许的最大深度,可以通过meta查看当前深度;0表示无深度
DEPTH_LIMIT = 3

# 爬取时,0表示深度优先Lifo(默认);1表示广度优先FiFo

#后进先出,深度优先
DEPTH_PRIORITY = 0
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleLifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.LifoMemoryQueue'

#先进先出,广度优先
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'

15. 调度器队列
SCHEDULER = 'scrapy.core.scheduler.Scheduler'
from scrapy.core.scheduler import Scheduler


#官方文档:
Does Scrapy crawl in breadth-first or depth-first order?
 https://doc.scrapy.org/en/latest/faq.html#faq-bfo-dfo
 Does Scrapy crawl in breadth-first or depth-first order?

By default, Scrapy uses a LIFO queue for storing pending requests, which basically means that it crawls in DFO order. This order is more convenient in most cases. If you do want to crawl in true BFO order, you can do it by setting the following settings:

DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'



 
 爬取策略
针对不同的场景可能会选择不同的队列。

FIFO 先进先出, 队列针对时间顺排
LIFO 后进先出, 队列针对时间倒排
DFS 深度优先, 针对depth(按照referer建立树的深度)倒排
BFS 广度优先, 针对depth(按照referer建立树的深度)顺排
在scrapy的文档中有介绍如何设置各种队列。在frontera中也是以这几种策略为基础,生成scoring log
值得一提的是,在网站数目较多的时候(200~500)个, 这些策略的稳定性都不是很好,(控制单个域名访问频率)亲测都有一定概率遭遇队列阻塞。刚开始下载量可以到1200 page/min, 渐渐降低到300~500, 谈不上慢,但总有些损耗。



Scrapy设置之Crawling style
2016年04月10日 10:29:47
阅读数:3150
Scrapy可以设置优先抓取哪些网页,设置DEPTH_LIMIT可以控制抓取的最大深度,如果设为0则意味着没有限制。把DEPTH_PRIORITY(默认值为0)设置为一个正值后,Scrapy的调度器的队列就会从LIFO变成FIFO,因此抓取规则就由DFO(深度优先)变成了BFO(广度优先):

DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'

这在爬网站的时候是很有用的,例如,一个新闻的门户网站,主页上有很多最近的新闻,其中每个新闻页面都有到其他页面的外链。默认情况下,Scrapy会在主页的第一个新闻中尽可能地深入,然后才会继续其他的新闻。而BFO顺序会先抓取顶层(即主页上的)的链接,然后才会进一步深入。此时若与DEPTH_LIMIT联合使用,比如将其设置为3,就可以快速地在门户网站上获取最近的新闻了。

 

posted @ 2018-06-19 21:09  whitesky-root  阅读(454)  评论(0)    收藏  举报