cccicl
cccicl
发布于 2周前

HTTPConnectionPool(host:XX)Max retries exceeded with url 解决方法

爬虫多次访问同一个网站一段时间后会出现错误

HTTPConnectionPool(host:XX)Max retries exceeded with url '<requests.packages.urllib3.connection.HTTPConnection object at XXXX>: Failed to establish a new connection: [Errno 99] Cannot assign requested address'

是因为在每次数据传输前客户端要和服务器建立TCP连接,为节省传输消耗,默认为keep-alive,即连接一次,传输多次,然而在多次访问后不能结束并回到连接池中,导致不能产生新的连接

headers中的Connection默认为keep-alive,

将header中的Connection一项置为close

headers = {

'Connection': 'close',

}

r = requests.get(url, headers=headers)


解决问题的原因:http连接太多没有关闭导致的

解决办法:

1、增加重试连接次数

requests.adapters.DEFAULT_RETRIES =5

2、关闭多余的连接

requests使用了urllib3库,默认的http connection是keep-alive的,requests设置False关闭。

s = requests.session()

s.keep_alive = False


Python爬取知乎回答信息碰到:Max retries exceeded with URL

开始我以为程序逻辑出错了,折腾了很久,知乎现在要爬取回答下面所有信息的话,就得翻页了,而获取翻页以及更多的信息就得考虑异步加载。

然后在浏览器里面找到了下一页的url

其中,next就是下一页的url,previous就是上一页的url,total:518是问题下回答的总数。

估计知乎对这些url的访问做了限制,虽然我弄了代理,但还是碰到了这个问题。

解决办法如下:

在requests库获取html时,如果碰到访问不成功,则用try-except加上循环继续访问,并用sleep控制访问频率

html =""

whilehtml =="": #因为请求可能被知乎拒绝,采用循环+sleep的方式重复发送,但保持频率不太高

try:

proxies = get_random_ip(ipList)

print("这次试用ip:{}".format(proxies))

r = requests.request("GET", url, headers=headers, params=querystring, proxies=proxies)

r.encoding ='utf-8'

html = r.text

returnhtml

except:

print("Connection refused by the server..")

print("Let me sleep for 5 seconds")

print("ZZzzzz...")

sleep(5)

print("Was a nice sleep, now let me continue...")

continue

问题到这里应该就解决了。