2017-09-05 106 views
1

我想通過Scrapy刮一個網站。但是,該網站有時非常緩慢,並且在瀏覽器中首次請求時需要花費將近15-20秒的時間。無論如何,有時候,當我嘗試使用Scrapy抓取網站時,我不斷收到TCP超時錯誤。即使網站在我的瀏覽器上打開狀況良好。這裏的消息:Scrapy - 設置TCP連接超時

2017-09-05 17:34:41 [scrapy.downloadermiddlewares.retry] DEBUG: Gave up retrying <GET http://www.hosane.com/result/spec 
ialList> (failed 16 times): TCP connection timed out: 10060: A connection attempt failed because the connected party di 
d not properly respond after a period of time, or established connection failed because connected host has failed to re 
spond.. 

我甚至覆蓋了USER_AGENT設置進行測試。 我不認爲DOWNLOAD_TIMEOUT設置在這種情況下工作,因爲它默認爲180秒,並且在給出TCP超時錯誤之前,Scrapy甚至不需要20-30秒。

任何想法是什麼導致這個問題?有沒有辦法在Scrapy中設置TCP超時?

回答

7

TCP connection timed out可以因爲實際的初始TCP連接超時Scrapy指定DOWNLOAD_TIMEOUT之前發生由OS定義的,通常是在TCP SYN分組重傳的條款。

默認情況下,在我的Linux機器,我有6個重發:

cat /proc/sys/net/ipv4/tcp_syn_retries 
6 

其中,在實踐中,Scrapy也意味着0 + 1 + 2 + 4 + 8 + 16 + 32 (+64) = 127 seconds receiveing從扭曲的twisted.internet.error.TCPTimedOutError: TCP connection timed out: 110: Connection timed out.之前。 (這是在初始試驗中,每次重試之間,而不是在接收到第六重試後的回覆然後指數回退。)

如果我設置/proc/sys/net/ipv4/tcp_syn_retries至8,例如,我可以驗證我收到此代替:

User timeout caused connection failure: Getting http://www.hosane.com/result/specialList took longer than 180.0 seconds. 

那是因爲0+1+2+4+8+16+32+64+128(+256) > 180

10060: A connection attempt failed...似乎是Windows套接字錯誤代碼。如果要將TCP連接超時更改爲至少DOWNLOAD_TIMEOUT,則需要更改TCP SYN重試計數。 (我不知道如何在你的系統上做,但Google是你的朋友。)

+0

非常感謝!這似乎是正確的答案。試用後我會盡快回復您! :) – Asym

+0

請注意,對於我來說,即使超時時間很長,該網站並沒有每次都做出迴應,而且通常也沒有。 –

+0

但是我能夠在我的瀏覽器中訪問該網站...那麼爲什麼它與Scrapy的行爲不同,即使是用戶代理... – Asym