如果大家使用Python来写爬虫的时候,都会使用到requests组件。这个组件是Python调用其他地址最好用的组件之一。
但是今天在Python的web项目中遇到了HTTPConnectionPool(host:XX)Max retries exceeded with url 的BUG。
BUG代码如下:
result_data = requests.get(tiantian_url, headers=headers)
下面我们就来说说,该BUG的解决方式:
1.requests组件的版本太落后,需要更新组件 sudo pip install --upgrade requests
2.在requests调用url的过程中,其连接状态是保持着keep-alive持续连接状态的。所以如果频繁调用,系统就会报Max retries exceeded with,这时我们就需要来关闭该连接。
本人直接提供最好的关闭方式。
headers = {
'Connection': 'close',
}
s = requests.Session()
tiantian_data = None
with requests.Session() as s:
result_data = s.get(tiantian_url, headers=headers)
tiantian_data = ast.literal_eval(result_data.text)
print(tiantian_data)
以上就是该问题的解决方式。
补充,如果大家在用Python写web项目的时候,需要请求别人的接口,最好使用aiohttp模块。
因为aiohttp模块是异步的,可以更好的实现web的场景,以下是我针对上面的request模块重新编写的代码,亲测可用。
import aiohttp
async def fetch_async(url, headers=None):
async with aiohttp.ClientSession(headers=headers) as session: #协程嵌套,只需要处理最外层协程即可fetch_async
async with session.get(url, timeout=2) as resp:
result = await resp.text()
return result
try:
result_data = await fetch_async(tiantian_url)
tiantian_data = ast.literal_eval(result_data)
print(tiantian_data)
except Exception as e:
print("error:" + str(e))
traceback.print_exc()
data_json = ast.literal_eval(data)
这种方法可以把数据很方便处理成json型(结构化型)
如果大家有兴趣,可以看我的这篇文章。
https://blog.csdn.net/weixin_38040473/article/details/82108363