Praca tutaj jest zeskrobać API witrynę, która rozpoczyna się od https://xxx.xxx.xxx/xxx/1.json
celu https://xxx.xxx.xxx/xxx/1417749.json
i zapisz go dokładnie MongoDB. Do tego mam następujący kod:
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()
Ale wykonanie zadania zajmuje dużo czasu. Pytanie brzmi, jak mogę przyspieszyć ten proces.
python
mongodb
web-scraping
pymongo
Tek Nath
źródło
źródło
Odpowiedzi:
asyncio jest również rozwiązaniem, jeśli nie chcesz używać wielowątkowości
źródło
Istnieje kilka rzeczy, które możesz zrobić:
Kod równoległy stąd
Czasy od tego pytania do połączenia wielokrotnego użytku
źródło
Możesz poprawić swój kod w dwóch aspektach:
Za pomocą a
Session
, aby połączenie nie było ponownie konfigurowane na każde żądanie i pozostawało otwarte;Używanie równoległości w kodzie z
asyncio
;Spójrz tutaj https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html
źródło
Prawdopodobnie szukasz zgarniania asynchronicznego. Poleciłbym ci stworzyć kilka partii adresów URL, tj. 5 adresów URL (staraj się nie niszczyć strony) i zeskrobać je asynchronicznie. Jeśli nie wiesz zbyt wiele o asynchronizacji, przejdź do Google asyncio libary. Mam nadzieję, że mogę ci pomóc :)
źródło
Spróbuj podzielić żądania i skorzystać z operacji zapisu zbiorczego MongoDB.
Może to zaoszczędzić dużo czasu na następujące sposoby * Opóźnienie zapisu MongoDB * Opóźnienie synchronicznego połączenia sieciowego
Ale nie zwiększaj liczby żądań równoległych (wielkość porcji), zwiększy to obciążenie sieci serwera i serwer może uznać to za atak DDoS.
źródło
Zakładając, że nie zostaniesz zablokowany przez API i że nie ma żadnych limitów prędkości, ten kod powinien przyspieszyć proces 50 razy (być może więcej, ponieważ wszystkie żądania są teraz wysyłane przy użyciu tej samej sesji).
źródło
Zdarzyło mi się mieć to samo pytanie wiele lat temu. Nigdy nie jestem zadowolony z odpowiedzi opartych na pythonie, które są dość powolne lub zbyt skomplikowane. Po przejściu na inne dojrzałe narzędzia prędkość jest duża i nigdy nie wracam.
Ostatnio wykonuję takie kroki, aby przyspieszyć proces w następujący sposób.
aria2c -x16 -d ~/Downloads -i /path/to/urls.txt
aby pobrać te plikiTo najszybszy jak do tej pory proces.
Jeśli chodzi o skrobanie stron internetowych, pobieram nawet niezbędne * .html, zamiast odwiedzać stronę raz na raz, co w rzeczywistości nie ma znaczenia. Kiedy trafisz odwiedzenia strony, za pomocą narzędzi takich jak Pythona
requests
lubscrapy
czyurllib
, to nadal cache i pobrać całą zawartość internetową dla Ciebie.źródło
Najpierw utwórz listę wszystkich linków, ponieważ wszystkie są takie same, po prostu zmień iterację.
Po prostu zwiększając lub zmniejszając t_no możesz zmienić liczbę wątków ..
źródło