requests receive how form and python http-get grequests

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 en grequests.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.