最近经常接到别人反馈某个爬虫工具程序没有正常运行,需要下载的资讯数据也没有及时进行收录。
刚开始以为可能是机器的问题,偶尔机器会出现程序运行中途卡住的情况。
但随着异常的情况越来越频繁,我便只好去排查问题。
通过查看程序运行的日志信息,发现程序总是卡在requests请求的那一步。
这让我觉得很奇怪,这一步为什么会卡住呢,我已经设置了超时时间,按理说超时的话程序会进入异常啊,然而却什么异常信息都没有输出。
查找了相关的资料,发现确实存在这种情况。
requests文档上有写,timeout is not a time limit on the entire response download; rather, an exception is raised if the server has not issued a response for timeout seconds (more precisely, if no bytes have been received on the underlying socket for timeout seconds). If no timeout is specified explicitly, requests do not time out.
大概的意思就是说requests请求上设置的timeout不是整个响应下载的时间限制,这里的timeout应该理解为与服务器连接后接收数据的时间,如果超过规定的时间则为超时。这与我之前的理解有很大不同。
那么如何解决这个问题呢?
目前有两种方法解决,一种是更改dns,并且推荐阿里的dns,因为他们认为这里的卡住是因为卡在了dns解析那里。
另一种则是设置全局的socket超时时间,通过
import socket
socket.setdefaulttimeout(时间)
这两句代码来解决。
通过测试,使用第二种方案后,程序还是会卡住。(难道真的是卡在dns解析?如果是的话,只能更改dns吗?有没有别的办法?)
因为目前对网络连接方面不是很了解,所以尚不太清楚具体原因。这个问题先留在这,待解决时再来补充。
#补充
最近尝试了第二种方案,发现能够有效解决问题,就是说这里的请求确实是卡在了解析dns的那一步。
解决方案是直接修改linux机器的hosts文件,指定域名访问的ip地址,免去解析dns的步骤。