在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也會被請求
Scrapy中傳送請求的固定邏輯?為什麼要這樣寫?
相關文章
- 如何使用jMeter傳送兩個邏輯上相關的HTTP請求JMeterHTTP
- 什麼時候會傳送options請求
- Jmeter —— jmeter利用取樣器中http傳送請求JMeterHTTP
- scrapy-redis原始碼解讀之傳送POST請求Redis原始碼
- 為什麼要這樣寫final ReentrantLock lock = this.lock; ?ReentrantLock
- SpringMVC中如何傳送GET請求、POST請求、PUT請求、DELETE請求。SpringMVCdelete
- 【轉】怎麼用PHP傳送HTTP請求(POST請求、GET請求)?PHPHTTP
- 從輸入url到傳送請求發生了什麼
- Nginx代理websocket為什麼要這樣做?NginxWeb
- Postman傳送Post請求Postman
- Java傳送Post請求Java
- 傳送GET請求 示例
- HttpClient--傳送請求HTTPclient
- perl傳送http請求HTTP
- java傳送http請求JavaHTTP
- nGrinder中快速編寫groovy指令碼04-傳送POST請求指令碼
- 如何在 Go 中傳送表單請求Go
- html頁面中如何傳送ajax請求HTML
- Koala Framework是什麼?我為什麼要寫這個框架?Framework框架
- Python開發技巧:scrapy-redis爬蟲如何傳送POST請求PythonRedis爬蟲
- 用xmlhttp傳送登出請求到伺服器的程式碼怎麼寫?XMLHTTP伺服器
- Postman傳送請求引數是Map格式的請求Postman
- 如何在 PHP 中傳送 xml 資料作為請求內容PHPXML
- 如何傳送請求以及AJAX
- C# 傳送POST請求C#
- 使用HttpClient傳送GET請求HTTPclient
- 使用httpclient傳送http請求HTTPclient
- 為什麼if中null要寫在前面?Null
- 為什麼 JavaScript 的 this 要這麼用?JavaScript
- sendredirect()方法是什麼樣的請求方式?
- Scrapy的日誌等級和請求傳參
- Zttp 傳送 form params 請求 而非 JSON 請求ORMJSON
- Vue 使用 Axios 傳送請求的請求體問題VueiOS
- Spring MVC的請求處理邏輯SpringMVC
- 為何要在componentDidMount裡面傳送請求?
- 以Raw的方式傳送POST請求
- java傳送http的get、post請求JavaHTTP
- 使用Postman傳送POST請求的指南Postman