python - receive - Usando grequests para hacer varios miles de solicitudes de obtención en sourceforge, obtenga "Max reintentos superados con url"
requests django (2)
Entonces, estoy respondiendo aquí, tal vez ayude a otros.
En mi caso, el servidor de destino no limitó la velocidad, sino algo mucho más simple: no cerré explícitamente las respuestas, por lo que mantuvieron el socket abierto y el proceso de Python se quedó sin los manejadores de archivos.
Mi solución (no sé a ciencia cierta cuál solucionó el problema, teóricamente cualquiera de ellos debería) fue:
Establecer
stream=False
engrequests.get
:rs = (grequests.get(u, stream=False) for u in urls)
Llame explícitamente
response.close()
después de leer response.content:responses = grequests.map(rs) for response in responses: make_use_of(response.content) response.close()
Nota: simplemente destruir el objeto de response
(asignarle None
, llamar a gc.collect()
) no fue suficiente, esto no cerró los manejadores de archivos.
Soy muy nuevo en todo esto; Necesito obtener datos sobre varios miles de proyectos de sourceforge para un documento que estoy escribiendo. Los datos están disponibles gratuitamente en formato json en la url http://sourceforge.net/api/project/name/[project name] / json Tengo una lista de varios miles de estas URL y estoy usando el siguiente código.
import grequests
rs = (grequests.get(u) for u in ulist)
answers = grequests.map(rs)
Al usar este código, puedo obtener los datos de los 200 proyectos que me gustan, es decir, rs = (grequests.get(u) for u in ulist[0:199])
funciona, pero tan pronto como lo rs = (grequests.get(u) for u in ulist[0:199])
, todos los intentos se encuentran con
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
Entonces no puedo realizar más solicitudes hasta que cierre Python, pero tan pronto como reinicie Python puedo realizar otras 200 solicitudes.
He intentado usar grequests.map(rs,size=200)
pero esto parece no hacer nada.
Este se puede cambiar fácilmente para usar cualquier número de conexiones que desee.
MAX_CONNECTIONS = 100 #Number of connections you want to limit it to
# urlsList: Your list of URLs.
results = []
for x in range(1,pages+1, MAX_CONNECTIONS):
rs = (grequests.get(u, stream=False) for u in urlsList[x:x+MAX_CONNECTIONS])
time.sleep(0.2) #You can change this to whatever you see works better.
results.extend(grequests.map(rs)) #The key here is to extend, not append, not insert.
print("Waiting") #Optional, so you see something is done.