Páginas de destino raspando uma lista de domínios [fechados
-
21-09-2019 - |
Pergunta
Tenho uma lista razoavelmente longa de sites que quero baixar as páginas Landing (index.html ou equivalente). Atualmente, estou usando o SCRAPY (muito amor para os caras por trás disso - esta é uma estrutura fabulosa). A navegação é mais lenta nessa tarefa específica do que eu gostaria e estou me perguntando se o WGET ou uma outra alternativa seria mais rápida, dado o quão direto é a tarefa. Alguma ideia?
(Aqui está o que estou fazendo com o SCRAPY. Qualquer coisa que eu possa fazer para otimizar o Scrapy para esta tarefa?)
Então, eu tenho uma lista de URLs de partida como
start_urls = [google.com yahoo.com aol.com
E raspo o texto de cada resposta e o guardo em um XML. Preciso desligar o offsemiddleware para permitir vários domínios.
O scrapy funciona como esperado, mas parece lento (cerca de 1000 em uma hora ou 1 a cada 4 segundos). Existe uma maneira de acelerar isso aumentando o número de concorrentes_requests_per_spider enquanto executa uma única aranha? Algo mais?
Solução
Se você quiser uma maneira de baixar simultaneamente vários sites com o Python, você pode fazê -lo com as bibliotecas padrão como esta:
import threading
import urllib
maxthreads = 4
sites = ['google.com', 'yahoo.com', ] # etc.
class Download(threading.Thread):
def run (self):
global sites
while sites:
site = sites.pop()
print "start", site
urllib.urlretrieve('http://' + site, site)
print "end ", site
for x in xrange(min(maxthreads, len(sites))):
Download().start()
Você também pode conferir httplib2
ou PycURL
Para fazer o download para você em vez de urllib
.
Não estou claro exatamente como você deseja que o texto raspado seja XML, mas você pode usar xml.etree.ElementTree
da biblioteca padrão ou você pode instalar BeautifulSoup
(o que seria melhor, pois lida com a marcação malformada).