2017-09-05 777 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