vlambda博客
学习文章列表

scrapy是深度优先还是广度优先?-Python每日3题(爬虫专题)

这里是Python7编程挑战-爬虫专题!

每天学习3个问题,包括初级,中级,高级问题各1个。

今天是第7天!一起来呀,就7天!

  1. 每日3题是麦叔的面试系列专题之一,每天包括初级,中级,高级难度题目各一道。
  2. 每日3题,100天之后成为大牛!
  3. 如果有不明白的,给麦叔留言。

[Easy] request请求方式中的POST、GET有什么区别

思考30秒再往下翻...

GET一般用于获取/查询资源信息,而POST一般用于更新资源信息

GET是在url中传递数据,数据放在请求头中,POST是在请求体中传递数据

GET安全性非常低,POST安全性较高,但是GET执行效率却比POST方法高

[Normal] scrapy是深度优先还是广度优先?

思考30秒再往下翻...

深度优先是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续追踪链接 

广度优先,有人也叫宽度优先,是指将新下载网页发现的链接直接插入到待抓取URL队列的末尾,也就是指网络爬虫会先抓取起始页中的所有网页,然后在选择其中的一个连接网页,继续抓取在此网页中链接的所有网页。

因为scrapy使用的是后进先出队列,所以默认是深度优先(DFO)。如果需要设置广度优先(BFO),可以在settings中添加以下代码。

# 爬虫允许的最大深度,可以通过meta查看当前深度;0表示无深度
DEPTH_LIMIT = 3
 
# 爬取时,0表示深度优先Lifo(默认);1表示广度优先FiFo
# 后进先出,深度优先
# DEPTH_PRIORITY = 0
# SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleLifoDiskQueue'
# SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.LifoMemoryQueue'
 
# 先进先出,广度优先
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'

[Hard] scrapy框架中各组件的作用?

思考30秒再往下翻...

  • Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。 

  • Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。 

  • Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。

  • Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。

  • Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。

  • Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。 

  • Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)


支持麦叔,请点在看,谢谢!