Scrapy中傳送請求的固定邏輯?為什麼要這樣寫?

无悔的选择發表於2024-09-10

在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也會被請求

相關文章