Eu recentemente aprendi Python e estou mergulhando minha mão na construção de um raspador de web. Não é nada extravagante; seu único objetivo é obter os dados de um site de apostas e colocá-los no Excel.
A maioria dos problemas é solucionável e estou tendo uma boa bagunça. No entanto, estou enfrentando um grande obstáculo em relação a um problema. Se um site carrega uma tabela de cavalos e lista os preços atuais das apostas, essas informações não estão em nenhum arquivo de origem. A pista é que esses dados estão ativos algumas vezes, com os números sendo atualizados obviamente a partir de algum servidor remoto. O HTML no meu PC simplesmente tem um buraco no qual seus servidores estão empurrando todos os dados interessantes que eu preciso.
Agora, minha experiência com o conteúdo dinâmico da Web é baixa, então é algo que estou tendo problemas para entender.
Eu acho que Java ou Javascript é uma chave, isso aparece com freqüência.
O raspador é simplesmente um mecanismo de comparação de probabilidades. Alguns sites têm APIs, mas eu preciso disso para aqueles que não têm. Eu estou usando a biblioteca scrapy com Python 2.7
Peço desculpas se esta pergunta é muito aberta. Em resumo, minha pergunta é: como o raspador pode ser usado para raspar esses dados dinâmicos para que eu possa usá-los? Para que eu possa raspar esses dados de probabilidades de apostas em tempo real?
fonte
Firefox
extensões comohttpFox
ouliveHttpHeaders
e carregue uma página que esteja usando solicitação ajax. O Scrapy não identifica automaticamente as solicitações de ajax, você deve procurar manualmente o URL de ajax apropriado e, em seguida, solicitar com isso.Respostas:
Os navegadores baseados no Webkit (como Google Chrome ou Safari) possuem ferramentas de desenvolvedor integradas. No Chrome, você pode abri-lo
Menu->Tools->Developer Tools
. ANetwork
guia permite que você veja todas as informações sobre cada solicitação e resposta:Na parte inferior da imagem, você pode ver que eu filtrei a solicitação até
XHR
- estas são solicitações feitas pelo código javascript.Dica: o log é limpo toda vez que você carrega uma página, na parte inferior da imagem, o botão de ponto preto preserva o log.
Após analisar solicitações e respostas, você pode simular essas solicitações do seu rastreador da Web e extrair dados valiosos. Em muitos casos, será mais fácil obter seus dados do que analisar o HTML, porque esses dados não contêm lógica de apresentação e estão formatados para serem acessados pelo código javascript.
Firefox tem extensão semelhante, é chamado firebug . Alguns argumentam que o firebug é ainda mais poderoso, mas eu gosto da simplicidade do webkit.
fonte
Aqui está um exemplo simples de
scrapy
com uma solicitação AJAX. Vamos ver o site rubin-kazan.ru .Todas as mensagens são carregadas com uma solicitação AJAX. Meu objetivo é buscar essas mensagens com todos os seus atributos (autor, data, ...):
Quando analiso o código-fonte da página, não consigo ver todas essas mensagens porque a página da Web usa a tecnologia AJAX. Mas posso com o Firebug do Mozilla Firefox (ou uma ferramenta equivalente em outros navegadores) analisar a solicitação HTTP que gera as mensagens na página da web:
Ele não recarrega a página inteira, mas apenas as partes da página que contêm mensagens. Para isso, clico em um número arbitrário de página na parte inferior:
E observo a solicitação HTTP que é responsável pelo corpo da mensagem:
Após terminar, analiso os cabeçalhos da solicitação (devo citar que esse URL extrairei da página de origem da seção var, veja o código abaixo):
E o conteúdo dos dados do formulário da solicitação (o método HTTP é "Post"):
E o conteúdo da resposta, que é um arquivo JSON:
Que apresenta todas as informações que estou procurando.
A partir de agora, devo implementar todo esse conhecimento em scrapy. Vamos definir a aranha para esse fim:
Na
parse
função, tenho a resposta para o primeiro pedido. EmRubiGuessItem
eu tenho o arquivo JSON com todas as informações.fonte
re
módulo (expressões regulares), procura a string'url_list_gb_messages="(.*)"'
e isola o conteúdo dos parênteses na variável de mesmo nome. Esta é uma introdução agradável: guru99.com/python-regular-expressions-complete-tutorial.htmlMuitas vezes, durante o rastreamento, encontramos problemas em que o conteúdo renderizado na página é gerado com Javascript e, portanto, o scrapy não pode rastrear por ele (por exemplo, solicitações de ajax, loucura do jQuery).
No entanto, se você usar o Scrapy junto com a estrutura de teste da web Selenium, poderemos rastrear qualquer coisa exibida em um navegador da web normal.
Algumas coisas a serem observadas:
É necessário ter a versão Python do Selenium RC instalada para que isso funcione e você deve ter configurado o Selenium corretamente. Além disso, este é apenas um rastreador de modelos. Você poderia ficar muito mais louco e mais avançado com as coisas, mas eu só queria mostrar a idéia básica. Como o código está agora, você fará duas solicitações para qualquer URL. Uma solicitação é feita pela Scrapy e a outra pela Selenium. Estou certo de que existem maneiras de contornar isso para que você possa fazer com que o Selenium faça a única solicitação, mas não me importei em implementá-la e, ao fazer duas solicitações, você também pode rastrear a página com o Scrapy.
Isso é bastante poderoso, porque agora você tem todo o DOM renderizado disponível para rastreamento e ainda pode usar todos os bons recursos de rastreamento do Scrapy. Isso tornará o rastreamento mais lento, é claro, mas dependendo de quanto você precisar do DOM renderizado, pode valer a pena esperar.
Referência: http://snipplr.com/view/66998/
fonte
selenium=3.3.1
epython=2.7.10
, erro ao importar o selênio de selêniofrom selenium import webdriver
ouchromedriver
ou o que acontecer de você estar usando. Docs EDIT: adicione referência de documentação e mude minha gramática horrível!Outra solução seria implementar um manipulador de downloads ou um middleware de manipulador de downloads. (consulte a documentação do scrapy para obter mais informações sobre o downloader middleware) A seguir, é apresentado um exemplo de classe usando selenium com driver de web phantomjs sem cabeça:
1) Defina a classe dentro do
middlewares.py
script.2) Adicione
JsDownload()
classe à variávelDOWNLOADER_MIDDLEWARE
dentro desettings.py
:3) Integre o
HTMLResponse
interioryour_spider.py
. Decodificar o corpo da resposta obterá a saída desejada.Complemento opcional:
eu queria dizer a diferentes aranhas qual middleware usar, então implementei este wrapper:
para que o invólucro funcione, todas as aranhas devem ter no mínimo:
para incluir um middleware:
Vantagem:
A principal vantagem de implementá-lo dessa maneira, e não na aranha, é que você acaba fazendo apenas uma solicitação. Na solução da AT, por exemplo: O manipulador de download processa a solicitação e entrega a resposta à aranha. O spider então faz uma nova solicitação na função parse_page - são duas solicitações para o mesmo conteúdo.
fonte
process_requests
,if spider.name in ['spider1', 'spider2']
em vez do decoradorEu estava usando um middleware de download personalizado, mas não estava muito feliz com isso, pois não consegui fazer o cache funcionar com ele.
Uma abordagem melhor foi implementar um manipulador de download personalizado.
Há um exemplo de trabalho aqui . Se parece com isso:
Suponha que seu raspador se chame "raspador". Se você colocar o código mencionado dentro de um arquivo chamado handlers.py na raiz da pasta "scraper", poderá adicionar ao seu settings.py:
E voilà, o JS analisou o DOM, com cache fragmentado, novas tentativas, etc.
fonte
Eu me pergunto por que ninguém postou a solução usando apenas o Scrapy.
Confira a postagem do blog da equipe Scrapy SCRAPING INFINITE SCROLLING PAGES . O exemplo retira o site http://spidyquotes.herokuapp.com/scroll que usa rolagem infinita.
A idéia é usar as Ferramentas de desenvolvedor do seu navegador e observar as solicitações AJAX; depois, com base nessas informações, crie as solicitações para Scrapy .
fonte
Sim, o Scrapy pode descartar sites dinâmicos, sites renderizados por meio de javaScript.
Existem duas abordagens para eliminar esse tipo de site.
Primeiro,
você pode usar
splash
para renderizar o código Javascript e analisar o HTML renderizado. você pode encontrar o documento e o projeto aqui Scrapy splash, gitSegundo,
Como todo mundo está afirmando, monitorando o
network calls
sim, você pode encontrar a chamada da API que busca os dados e zomba da chamada no seu spider scrapy, que pode ajudá-lo a obter os dados desejados.fonte
Trato da solicitação do ajax usando o Selenium e o driver da web do Firefox. Não é tão rápido se você precisar do rastreador como um daemon, mas muito melhor do que qualquer solução manual. Eu escrevi um pequeno tutorial aqui para referência
fonte