El trabajo aquí es para raspar una API un sitio que se inicia a partir https://xxx.xxx.xxx/xxx/1.json
de https://xxx.xxx.xxx/xxx/1417749.json
y escribir exactamente a mongodb. Para eso tengo el siguiente código:
client = pymongo.MongoClient("mongodb://127.0.0.1:27017")
db = client["thread1"]
com = db["threadcol"]
start_time = time.time()
write_log = open("logging.log", "a")
min = 1
max = 1417749
for n in range(min, max):
response = requests.get("https:/xx.xxx.xxx/{}.json".format(str(n)))
if response.status_code == 200:
parsed = json.loads(response.text)
inserted = com.insert_one(parsed)
write_log.write(str(n) + "\t" + str(inserted) + "\n")
print(str(n) + "\t" + str(inserted) + "\n")
write_log.close()
Pero lleva mucho tiempo hacer la tarea. La pregunta aquí es cómo puedo acelerar este proceso.
python
mongodb
web-scraping
pymongo
Tek Nath
fuente
fuente
Respuestas:
Asyncio también es una solución si no desea utilizar subprocesos múltiples
fuente
Hay varias cosas que puedes hacer:
Código paralelo desde aquí
Tiempos de esta pregunta para conexión reutilizable
fuente
Puede mejorar su código en dos aspectos:
Usar a
Session
, de modo que una conexión no se reorganice en cada solicitud y se mantenga abierta;Usando paralelismo en su código con
asyncio
;Eche un vistazo aquí https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html
fuente
Lo que probablemente esté buscando es un raspado asincrónico. Le recomendaría que cree algunos lotes de URL, es decir, 5 URL (trate de no bloquear el sitio web) y que las elimine de forma asíncrona. Si no sabe mucho sobre async, busque google for the libary asyncio. Espero que te pueda ayudar :)
fuente
Intente fragmentar las solicitudes y utilice la operación de escritura masiva MongoDB.
Esto podría ahorrar mucho tiempo de las siguientes maneras: * latencia de escritura MongoDB * latencia de llamadas de red síncrona
Pero no aumente el recuento de solicitudes paralelas (tamaño de fragmento), aumentará la carga de red del servidor y el servidor podría pensar que esto es un ataque DDoS.
fuente
Suponiendo que la API no lo bloqueará y que no hay límites de velocidad, este código debería hacer que el proceso sea 50 veces más rápido (tal vez más porque todas las solicitudes se envían ahora usando la misma sesión).
fuente
Tuve la misma pregunta hace muchos años. Nunca estoy satisfecho con las respuestas basadas en Python, que son bastante lentas o demasiado complicadas. Después de cambiar a otras herramientas maduras, la velocidad es rápida y nunca vuelvo.
Recientemente utilizo estos pasos para acelerar el proceso de la siguiente manera.
aria2c -x16 -d ~/Downloads -i /path/to/urls.txt
para descargar estos archivosEste es el proceso más rápido que encontré hasta ahora.
En términos de raspar páginas web, incluso descargo el * .html necesario, en lugar de visitar la página de vez en cuando, lo que en realidad no hace ninguna diferencia. Cuando visitas la página, con herramientas de Python como
requests
oscrapy
ourllib
, todavía almacena en caché y descarga todo el contenido web para ti.fuente
Primero crea una lista de todos los enlaces porque todos son iguales solo cambia iterala.
Simplemente aumentando o disminuyendo t_no puede cambiar no de hilos.
fuente