使用python做爬虫的过程中,经常会在较短的时间内构建大量的连接向服务器请求数据,遇到了这样的问题:

1
2
3
requests.exceptions.ConnectionError: HTTPConnectionPool(host='xxx', port=80):
Max retries exceeded with url: /document/record/_search?pretty=true (Caused by NewConnectionError
('<requests.packages.urllib3.connection.HTTPConnection object at 0x7f544af9a5d0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution',))

最开始看到Max retries exceeded with url还以为是请求过于频繁,自己的ip地址被ban了,而后又通过requests库手动发出一条请求,并没有上边的错误,看来并不是ip被ban。 又看到Temporary failure in name resolution,会不会是域名解析的问题?也不会,单独一条请求是可以正常返回结果的,拿到底是怎么回事? 经过一番google,stackoverflow之后看到了这几个答案:

结合自己出现问题的场景,应该就是因为在短时间内打开了太多的http连接,并且这些连接都是默认keep-alive的形式。 所以在request的header中添加了'Connection': close,并且在每个请求完成之后time.sleep(0.01)。

修改之后,爬虫跑了一夜没再出问题,开心。