Le travail ici consiste à supprimer une API d'un site qui commence à partir https://xxx.xxx.xxx/xxx/1.json
de https://xxx.xxx.xxx/xxx/1417749.json
et à l'écrire exactement sur mongodb. Pour cela j'ai le code suivant:
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()
Mais cela prend beaucoup de temps pour faire la tâche. La question ici est de savoir comment puis-je accélérer ce processus.
python
mongodb
web-scraping
pymongo
Tek Nath
la source
la source
Réponses:
asyncio est également une solution si vous ne souhaitez pas utiliser le multi-threading
la source
Vous pouvez faire plusieurs choses:
Code parallèle d' ici
Timings de cette question pour une connexion réutilisable
la source
Vous pouvez améliorer votre code sur deux aspects:
Utiliser a
Session
, afin qu'une connexion ne soit pas réorganisée à chaque demande et reste ouverte;Utiliser le parallélisme dans votre code avec
asyncio
;Jetez un œil ici https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html
la source
Ce que vous recherchez probablement, c'est le grattage asynchrone. Je vous recommande de créer des lots d'URL, c'est-à-dire 5 URL (essayez de ne pas chrasher le site), et de les gratter de manière asynchrone. Si vous ne savez pas grand chose sur async, google pour l'asyncio libary. J'espère pouvoir vous aider :)
la source
Essayez de fragmenter les demandes et utilisez l'opération d'écriture en bloc MongoDB.
Cela peut vous faire gagner beaucoup de temps des manières suivantes * Latence d'écriture MongoDB * Latence des appels réseau synchrones
Mais n'augmentez pas le nombre de requêtes parallèles (taille de bloc), cela augmentera la charge réseau du serveur et le serveur pourrait penser cela comme une attaque DDoS.
la source
En supposant que vous ne serez pas bloqué par l'API et qu'il n'y a pas de limite de débit, ce code devrait rendre le processus 50 fois plus rapide (peut-être plus car toutes les demandes sont désormais envoyées en utilisant la même session).
la source
J'ai eu la même question il y a de nombreuses années. Je ne suis jamais satisfait des réponses basées sur python, qui sont assez lentes ou trop compliquées. Après avoir basculé vers d'autres outils matures, la vitesse est rapide et je ne reviens jamais.
Récemment, j'utilise ces étapes pour accélérer le processus comme suit.
aria2c -x16 -d ~/Downloads -i /path/to/urls.txt
pour télécharger ces fichiersC'est le processus le plus rapide à ce jour.
En ce qui concerne le raclage des pages Web, je télécharge même le fichier * .html nécessaire, au lieu de visiter la page une fois à la fois, ce qui ne fait aucune différence. Lorsque vous cliquez sur visiter la page, avec des outils python comme
requests
ouscrapy
ouurllib
, il met toujours en cache et télécharge tout le contenu Web pour vous.la source
Créez d'abord une liste de tous les liens, car tous sont identiques, il suffit de le modifier.
En augmentant ou en diminuant simplement t_no, vous pouvez modifier le nombre de threads.
la source