使用grequests向sourceforge发出数千个请求,获取"使用url超出最大重试次数"

crf*_*crf 22 python http-get grequests

我对这一切都很陌生; 我需要获得数千个sourceforge项目的数据,以便我写一篇论文.数据全部以json格式免费提供,网址为http://sourceforge.net/api/project/name/[project name]/json.我有几千个URL的列表,我使用以下代码.

import grequests
rs = (grequests.get(u) for u in ulist)
answers = grequests.map(rs)
Run Code Online (Sandbox Code Playgroud)

使用此代码,我能够获得我喜欢的任何200个左右项目的数据,即rs = (grequests.get(u) for u in ulist[0:199])工作,但是一旦我查看,所有尝试都会得到满足

ConnectionError: HTTPConnectionPool(host='sourceforge.net', port=80): Max retries exceeded with url: /api/project/name/p2p-fs/json (Caused by <class 'socket.gaierror'>: [Errno 8] nodename nor servname provided, or not known)
<Greenlet at 0x109b790f0: <bound method AsyncRequest.send of <grequests.AsyncRequest object at 0x10999ef50>>(stream=False)> failed with ConnectionError
Run Code Online (Sandbox Code Playgroud)

在我退出python之前,我无法再提出任何请求,但是一旦我重新启动python,我就可以再发出200个请求.

我尝试过使用grequests.map(rs,size=200)但似乎什么也没做.

Vir*_*gil 24

所以,我在这里回答,也许它会帮助别人.

在我的情况下,它不是目标服务器的速率限制,但更简单:我没有显式关闭响应,因此他们保持套接字打开,并且python进程用完了文件句柄.

我的解决方案(不确定哪一个解决了问题 - 理论上它们中的任何一个应该)是:

注意:简单地销毁response对象(分配None给它,调用gc.collect())是不够的 - 这并没有关闭文件处理程序.

  • 您是否需要为此工作提出大量要求?如果有一种方法可以将更大的url列表传递给grequests并让它自动关闭响应,那将是理想的,但这似乎不是基于github代码和文档的选项. (2认同)