Estou tentando desenvolver um raspador de web simples. Quero extrair texto sem o código HTML. De fato, alcancei esse objetivo, mas vi que em algumas páginas onde o JavaScript é carregado, não obtive bons resultados.
Por exemplo, se algum código JavaScript adiciona algum texto, não consigo vê-lo, porque quando ligo
response = urllib2.urlopen(request)
Recebo o texto original sem o adicionado (porque o JavaScript é executado no cliente).
Então, estou procurando algumas idéias para resolver esse problema.
python
web-scraping
python-2.x
urlopen
mocopera
fonte
fonte
Respostas:
EDIT 30 / Dez / 2017: Esta resposta aparece nos principais resultados das pesquisas no Google, então decidi atualizá-la. A resposta antiga ainda está no fim.
O dryscape não é mais mantido e a biblioteca que os desenvolvedores do dryscape recomendam é apenas Python 2. Descobri que o uso da biblioteca python do Selenium com o Phantom JS como um driver da Web é rápido o suficiente e fácil de realizar o trabalho.
Depois de instalar o Phantom JS , verifique se o
phantomjs
binário está disponível no caminho atual:Exemplo
Para dar um exemplo, criei uma página de amostra com o seguinte código HTML. ( link ):
sem javascript diz:
No javascript support
e com javascript:Yay! Supports javascript
Raspagem sem suporte a JS:
Raspagem com suporte a JS:
Você também pode usar o dryscrape da biblioteca Python para raspar sites direcionados a javascript.
Raspagem com suporte a JS:
fonte
@Expenzor
Eu estou trabalhando no Windows. PhantomJS funciona bem.Não estamos obtendo os resultados corretos porque qualquer conteúdo gerado em javascript precisa ser renderizado no DOM. Quando buscamos uma página HTML, buscamos a inicial, sem modificação por javascript, DOM.
Portanto, precisamos renderizar o conteúdo javascript antes de rastrear a página.
Como o selênio já é mencionado várias vezes neste tópico (e o quão lento às vezes também foi mencionado), listarei duas outras soluções possíveis.
Solução 1: este é um tutorial muito bom sobre como usar o Scrapy para rastrear conteúdo gerado por javascript e seguiremos exatamente isso.
Do que precisaremos:
Docker instalado em nossa máquina. Essa é uma vantagem sobre outras soluções até este momento, pois utiliza uma plataforma independente do SO.
Instale o Splash seguindo as instruções listadas para o sistema operacional correspondente.
Citando a partir da documentação inicial:
Basicamente, vamos usar o Splash para renderizar o conteúdo gerado pelo Javascript.
Execute o servidor salpicos:
sudo docker run -p 8050:8050 scrapinghub/splash
.Instale o plug- in scrapy-splash :
pip install scrapy-splash
Supondo que já tenhamos um projeto Scrapy criado (caso contrário, vamos criar um ), seguiremos o guia e atualizaremos o
settings.py
:Finalmente, podemos usar um
SplashRequest
:Solução 2: Vamos chamar isso de experimental no momento (maio de 2018) ...
Esta solução é apenas para a versão 3.6 do Python (no momento).
Você conhece o módulo de solicitações (bem quem não conhece)?
Agora ele tem uma web que rasteja pouco irmão: orders-HTML :
Instale orders-html:
pipenv install requests-html
Faça uma solicitação para o URL da página:
Renderize a resposta para obter os bits gerados pelo Javascript:
Finalmente, o módulo parece oferecer recursos de raspagem .
Como alternativa, podemos tentar a maneira bem documentada de usar BeautifulSoup com o
r.html
objeto que acabamos de renderizar.fonte
r.html.html
objeto.Talvez o selênio possa fazer isso.
fonte
Se você já usou o
Requests
módulo para python antes, descobri recentemente que o desenvolvedor criou um novo módulo chamadoRequests-HTML
que agora também tem a capacidade de renderizar JavaScript.Você também pode visitar https://html.python-requests.org/ para saber mais sobre este módulo ou, se estiver interessado apenas em renderizar JavaScript, pode visitar https://html.python-requests.org/?#javascript -suporte para aprender diretamente como usar o módulo para renderizar JavaScript usando Python.
Essencialmente, depois de instalar corretamente o
Requests-HTML
módulo, o exemplo a seguir, mostrado no link acima , mostra como você pode usar esse módulo para raspar um site e renderizar JavaScript contido no site:Eu aprendi recentemente sobre isso em um vídeo do YouTube. Clique aqui! para assistir ao vídeo do YouTube, que demonstra como o módulo funciona.
fonte
Essa também parece ser uma boa solução, extraída de uma excelente postagem no blog
fonte
Parece que os dados que você está realmente procurando podem ser acessados via URL secundário chamado por algum javascript na página principal.
Embora você possa tentar executar o javascript no servidor para lidar com isso, uma abordagem mais simples pode ser carregar a página usando o Firefox e usar uma ferramenta como Charles ou Firebug para identificar exatamente o que é esse URL secundário. Depois, basta consultar esse URL diretamente para os dados que lhe interessam.
fonte
O Selenium é o melhor para copiar conteúdo JS e Ajax.
Verifique este artigo para extrair dados da Web usando Python
Faça o download do Chrome Webdriver.
Fácil né?
fonte
Você também pode executar o javascript usando o webdriver.
ou armazene o valor em uma variável
fonte
driver.title
propriedadeEu, pessoalmente, prefiro usar scrapy e selênio e dockerizing em recipientes separados. Dessa forma, você pode instalar os sites com menos problemas e rastrear sites modernos que quase todos contêm javascript de uma forma ou de outra. Aqui está um exemplo:
Use o
scrapy startproject
para criar seu raspador e escrever sua aranha, o esqueleto pode ser tão simples quanto isto:A verdadeira mágica acontece no middlewares.py. Substitua dois métodos no middleware do downloader
__init__
eprocess_request
da seguinte maneira:Não se esqueça de ativar esse software intermediário, descomentando as próximas linhas no arquivo settings.py:
Avançar para dockerization. Crie a
Dockerfile
partir de uma imagem leve (estou usando o python Alpine aqui), copie o diretório do projeto para ele, instale os requisitos:E, finalmente, junte tudo
docker-compose.yaml
:Corra
docker-compose up -d
. Se você estiver fazendo isso pela primeira vez, levará um tempo para buscar o último selênio / cromo independente e criar a imagem do seu raspador também.Uma vez feito, você pode verificar se seus contêineres estão em execução
docker ps
e também se o nome do contêiner de selênio corresponde ao da variável de ambiente que passamos ao nosso contêiner de raspador (aqui estavaSELENIUM_LOCATION=samplecrawler_selenium_1
).Digite o contêiner do seu raspador com
docker exec -ti YOUR_CONTAINER_NAME sh
, o comando para mim foidocker exec -ti samplecrawler_my_scraper_1 sh
: cd no diretório certo e execute o seu raspadorscrapy crawl my_spider
.A coisa toda está na minha página do github e você pode obtê-la aqui
fonte
Uma mistura de BeautifulSoup e Selenium funciona muito bem para mim.
PS Você pode encontrar mais condições de espera aqui
fonte
Você desejará usar urllib, solicitações, driver da web beautifulSoup e selenium em seu script para diferentes partes da página (para citar alguns).
Às vezes, você obtém o que precisa com apenas um desses módulos.
Às vezes, você precisará de dois, três ou todos esses módulos.
Às vezes, você precisará desativar os js no seu navegador.
Às vezes, você precisará de informações de cabeçalho em seu script.
Nenhum site pode ser raspado da mesma maneira e nenhum site pode ser raspado da mesma maneira para sempre, sem precisar modificar seu rastreador, geralmente depois de alguns meses. Mas todos eles podem ser raspados! Onde há vontade, há uma maneira de ter certeza.
Se você precisar coletar dados continuamente no futuro, basta coletar tudo o que precisa e armazená-los em arquivos .dat com pickle.
Continue pesquisando como tentar o que fazer com esses módulos e copiando e colando seus erros no Google.
fonte
Usando PyQt5
fonte
Estou tentando encontrar respostas para essas perguntas há dois dias. Muitas respostas direcionam você para diferentes questões. Mas a resposta de serpentr acima é realmente objetiva . É a solução mais curta e simples. Apenas um lembrete da última palavra "var" representa o nome da variável , portanto, deve ser usada como:
fonte
Eu tive que lidar com esse mesmo problema em alguns projetos de raspagem de minha própria página. Como eu lidei com isso foi usando a biblioteca de solicitações python para fazer uma solicitação http diretamente para a API, em vez de ter que carregar o JS.
A biblioteca de solicitações python funciona bem para isso, e você pode ver as solicitações http usando o elemento inspecionar e navegando até a guia rede.
fonte