Scrapy - 设置TCP连接超时

时间:2017-09-05 12:43:19

标签: web-scraping scrapy

我正在尝试通过Scrapy抓取一个网站。但是,网站有时非常慢,在浏览器的第一次请求响应时需要大约15-20秒。无论如何,有时,当我尝试使用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秒,而Scrapy在发出TCP超时错误之前甚至不需要20-30秒。

知道造成这个问题的原因是什么吗?有没有办法在Scrapy中设置TCP超时?

1 个答案:

答案 0 :(得分:8)

可以在Scrapy指定的TCP connection timed out之前发生DOWNLOAD_TIMEOUT,因为实际的初始TCP连接超时是由OS定义的,通常是根据TCP SYN数据包重新传输。

默认情况下,在我的Linux机器上,我有6次重传:

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

在实践中,对于Scrapy来说,在从Twisted收到0 + 1 + 2 + 4 + 8 + 16 + 32 (+64) = 127 seconds之前表示twisted.internet.error.TCPTimedOutError: TCP connection timed out: 110: Connection timed out.。 (这是初始试验,然后是每次重试之间的指数退避,并且在第6次重试后没有收到回复。)

例如,如果我将/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是您的朋友。)