O trabalho aqui é para raspar uma API um site que começa a partir https://xxx.xxx.xxx/xxx/1.json
de https://xxx.xxx.xxx/xxx/1417749.json
e escrevê-lo exatamente para MongoDB. Para isso, tenho o seguinte 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()
Mas está demorando muito tempo para fazer a tarefa. A questão aqui é como posso acelerar esse processo.
python
mongodb
web-scraping
pymongo
Tek Nath
fonte
fonte
Respostas:
o assíncio também é uma solução se você não quiser usar o multi threading
fonte
Há várias coisas que você pode fazer:
Código paralelo a partir daqui
Tempos desta pergunta para conexão reutilizável
fonte
Você pode melhorar seu código em dois aspectos:
Usando a
Session
, para que uma conexão não seja reorganizada a cada solicitação e seja mantida aberta;Usando paralelismo no seu código com
asyncio
;Dê uma olhada aqui https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html
fonte
O que você provavelmente está procurando é a raspagem assíncrona. Eu recomendo que você crie alguns lotes de URLs, ou seja, 5 URLs (tente não quebrar o site) e raspe-os de forma assíncrona. Se você não sabe muito sobre assíncrono, pesquise no google pelo asyncio libary. Espero poder ajudá-lo :)
fonte
Tente dividir as solicitações e use a operação de gravação em massa do MongoDB.
Isso pode economizar muito tempo das seguintes maneiras: * Latência de gravação do MongoDB * Latência de chamada de rede síncrona
Mas não aumente a contagem de solicitações paralelas (tamanho do Chunk). Isso aumentará a carga de rede do servidor e o servidor pode pensar isso como um ataque DDoS.
fonte
Supondo que você não seja bloqueado pela API e que não haja limites de taxa, esse código deve tornar o processo 50 vezes mais rápido (talvez mais porque todas as solicitações agora são enviadas usando a mesma sessão).
fonte
Eu tive a mesma pergunta há muitos anos. Nunca estou satisfeito com respostas baseadas em python, que são muito lentas ou muito complicadas. Depois de mudar para outras ferramentas maduras, a velocidade é rápida e nunca mais volto.
Recentemente, uso essas etapas para acelerar o processo da seguinte maneira.
aria2c -x16 -d ~/Downloads -i /path/to/urls.txt
para baixar esses arquivosEste é o processo mais rápido que eu vim até agora.
Em termos de raspagem de páginas da Web, eu até faço o download do * .html necessário, em vez de visitar a página uma vez por vez, o que realmente não faz diferença. Quando você clica em visitar a página, com ferramentas python como
requests
orscrapy
ouurllib
, ele ainda faz cache e baixa todo o conteúdo da web para você.fonte
Primeiro, crie uma lista de todos os links, pois todos são iguais, basta alterar a iteração.
Simplesmente aumentando ou diminuindo t_no, você pode alterar o número de threads.
fonte