Die Arbeit hier besteht darin, eine API einer Site zu kratzen, die von https://xxx.xxx.xxx/xxx/1.json
bis beginnt , https://xxx.xxx.xxx/xxx/1417749.json
und sie genau in mongodb zu schreiben. Dafür habe ich folgenden Code:
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()
Aber es braucht viel Zeit, um die Aufgabe zu erledigen. Die Frage hier ist, wie ich diesen Prozess beschleunigen kann.
python
mongodb
web-scraping
pymongo
Tek Nath
quelle
quelle
Antworten:
asyncio ist auch eine Lösung, wenn Sie kein Multithreading verwenden möchten
quelle
Sie können verschiedene Dinge tun:
Parallelcode von hier
Timings aus dieser Frage für wiederverwendbare Verbindung
quelle
Sie können Ihren Code in zwei Punkten verbessern:
Verwenden von a
Session
, damit eine Verbindung nicht bei jeder Anforderung neu angeordnet und offen gehalten wird;Verwenden der Parallelität in Ihrem Code mit
asyncio
;Schauen Sie hier https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html
quelle
Was Sie wahrscheinlich suchen, ist asynchrones Scraping. Ich würde Ihnen empfehlen, einige Stapel von URLs zu erstellen, dh 5 URLs (versuchen Sie, die Website nicht zu verdrängen) und sie asynchron zu kratzen. Wenn Sie nicht viel über Async wissen, googeln Sie für die Bibliothek asyncio. Ich hoffe, ich konnte dir helfen :)
quelle
Versuchen Sie, die Anforderungen zu unterteilen und die MongoDB-Massenschreiboperation zu verwenden.
Dies kann auf folgende Weise viel Zeit sparen: * MongoDB-Schreiblatenz * Synchrone Netzwerkanruflatenz
Erhöhen Sie jedoch nicht die Anzahl der parallelen Anforderungen (Blockgröße). Dies erhöht die Netzwerklast des Servers, und der Server könnte dies als DDoS-Angriff betrachten.
quelle
Unter der Annahme, dass Sie nicht von der API blockiert werden und dass es keine Ratenbeschränkungen gibt, sollte dieser Code den Prozess 50-mal beschleunigen (möglicherweise mehr, da alle Anforderungen jetzt mit derselben Sitzung gesendet werden).
quelle
Ich hatte vor vielen Jahren die gleiche Frage. Ich bin nie zufrieden mit Python-basierten Antworten, die ziemlich langsam oder zu kompliziert sind. Nachdem ich zu anderen ausgereiften Werkzeugen gewechselt bin, ist die Geschwindigkeit schnell und ich komme nie mehr zurück.
Kürzlich habe ich solche Schritte verwendet, um den Prozess wie folgt zu beschleunigen.
aria2c -x16 -d ~/Downloads -i /path/to/urls.txt
diese Option, um diese Dateien herunterzuladenDies ist der schnellste Prozess, den ich bisher gemacht habe.
In Bezug auf das Scraping von Webseiten lade ich sogar die erforderliche * .html herunter, anstatt die Seite einzeln zu besuchen, was eigentlich keinen Unterschied macht. Wenn schlagen Sie die Seite besuchen, mit Python - Tool wie
requests
oderscrapy
oderurllib
, es Cache noch und Download für Sie die gesamten Web - Inhalte.quelle
Erstellen Sie zuerst eine Liste aller Links, da alle gleich sind. Ändern Sie sie einfach und wiederholen Sie sie.
Durch einfaches Erhöhen oder Verringern von t_no können Sie die Anzahl der Threads ändern.
quelle