在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
- 為什麼要這樣寫final ReentrantLock lock = this.lock; ?ReentrantLock
- scrapy-redis原始碼解讀之傳送POST請求Redis原始碼
- SpringMVC中如何傳送GET請求、POST請求、PUT請求、DELETE請求。SpringMVCdelete
- [20210301]為什麼邏輯讀這麼多.txt
- 從輸入url到傳送請求發生了什麼
- Python開發技巧:scrapy-redis爬蟲如何傳送POST請求PythonRedis爬蟲
- 為何要在componentDidMount裡面傳送請求?
- java傳送http請求JavaHTTP
- Postman傳送Post請求Postman
- 傳送GET請求 示例
- Java傳送Post請求Java
- nGrinder中快速編寫groovy指令碼04-傳送POST請求指令碼
- Spring MVC的請求處理邏輯SpringMVC
- Nginx代理websocket為什麼要這樣做?NginxWeb
- Postman傳送請求引數是Map格式的請求Postman
- Vue 使用 Axios 傳送請求的請求體問題VueiOS
- html頁面中如何傳送ajax請求HTML
- 如何在 Go 中傳送表單請求Go
- Fescar example解析 - TM傳送邏輯
- 寫出幾個初始化CSS的樣式,並解釋說明為什麼要這樣寫CSS
- [20180410]為什麼2個邏輯讀不一樣.txt
- 使用Feign傳送HTTP請求HTTP
- 如何傳送請求以及AJAX
- python傳送HTTP POST請求PythonHTTP
- Scrapy的日誌等級和請求傳參
- 如何在 PHP 中傳送 xml 資料作為請求內容PHPXML
- 使用Postman傳送POST請求的指南Postman
- 以Raw的方式傳送POST請求
- 為什麼要寫這一系列的部落格
- 為什麼要寫作
- nodejs使用request傳送http請求NodeJSHTTP
- java傳送GET和post請求Java
- Python爬蟲(二)——傳送請求Python爬蟲
- Vue中封裝axios傳送請求Vue封裝iOS
- linux用curl傳送post請求Linux