Scrapy中发送请求的固定逻辑?为什么要这样写?

在Scrapy中,所有的请求都是通过yield Request(url,callback=self.parse2)这样的方式来发送的。这里的callback是为了告诉scrapy请求回来后应该去找谁
要理解这个,需要先知道Scrapy的请求流程,用一句话概括就是:所有的请求都要经过引擎交给调度器,然后反馈给引擎,然后走下载器,然后再回到引擎。
Spider->引擎->调度器->引擎->下载器->引擎->回调函数(parse)
Scrapy的请求流程:
1.Spider通过yield Request()生成请求
2.引擎接收请求并交给调度器
3.调度器将请求排队,然后请求返回给引擎
4.引擎将请求交给下载器,下载相应的网页内容
5.下载完成后,下载器将响应结果返回给引擎
6.最终,引擎将响应内容交给相应的回调函数进行处理
在Spider的源码中:
'''
def start_requests(self) -> Iterable[Request]:
if not self.start_urls and hasattr(self, "start_url"):
raise AttributeError(
"Crawling could not start: 'start_urls' not found "
"or empty (but found 'start_url' attribute instead, "
"did you miss an 's'?)"
)
for url in self.start_urls:
yield Request(url, dont_filter=True)
'''
这里的strat_requests方法遍历start_urls生成请求,每个请求通过yield发出;至于dont_filter=True是为了避免Scrapy的去重机制,即使是重复的URL也会被请求

posted @   无悔的选择  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示