Como fazer scraping de páginas de rolagem infinita usando Python

Como fazer, Python, Raspagem, Mar-06-20245 minutos de leitura

No mundo atual, todos utilizam as novas tecnologias. Pode obter acesso aos dados estruturados de forma automatizada com a ajuda da recolha de dados da Web. Por exemplo, pode utilizar a raspagem da Web para: O scrolling infinito, também conhecido como scrolling sem fim, é uma técnica de web design que os sítios Web utilizam frequentemente com AJAX ou Javascript

Índice

No mundo atual, todos utilizam as novas tecnologias. Pode obter acesso aos dados estruturados de forma automatizada com a ajuda da recolha de dados da Web. Por exemplo, pode utilizar a raspagem da Web para:

  • Controlo dos preços
  • Geração de contactos
  • Acompanhamento das notícias
  • Estudos de mercado
  • Inteligência de preços

O scrolling infinito, também conhecido como scrolling sem fim, é uma técnica de web design que os sítios Web utilizam frequentemente com AJAX ou Javascript para carregar conteúdo adicional de forma dinâmica quando o utilizador se desloca até ao fundo da página Web. Esta técnica ganhou popularidade devido ao seu sucesso nos sítios das redes sociais. Por exemplo, o scrolling infinito no Twitter é produzido através de carregamento assíncrono. O Twitter efectua chamadas AJAX depois de a página ser carregada para adicionar continuamente novos conteúdos à medida que a página se desloca. Embora o scrolling infinito tenha muitas vantagens, não é recomendado para tarefas de pesquisa orientadas para objectivos que exijam que as pessoas localizem um determinado conteúdo.

Comecemos por compreender as vantagens da recolha de dados de páginas de deslocação infinita.

Porque é que precisa de fazer scraping de páginas de scroll infinito?

Seguem-se algumas das razões para raspar páginas de deslocação infinita.

  • Envolvimento do utilizador - O scroll infinito mantém os utilizadores envolvidos numa página. Há toneladas de conteúdo gerado pelo utilizador para percorrer em sites de redes sociais como o Twitter e o Facebook, pelo que o utilizador está constantemente envolvido. 
  • Menos cliques - A deslocação requer menos ação e é mais fácil para os utilizadores do que clicar.
  • Ideal para dispositivos móveis - O scroll infinito é excelente para dispositivos móveis e ecrãs tácteis. Os utilizadores podem deslizar para baixo para gerar novos conteúdos em vez de mudar para novos separadores. 

Para além dos benefícios acima referidos da recolha de dados de páginas de deslocação infinita, existem também alguns contras, como por exemplo

  • Não é bom para a otimização dos motores de busca (SEO).
  • Não é fácil para os utilizadores com deficiências físicas navegarem nas páginas que têm um scroll infinito.
  • Os sítios Web de deslocação infinita podem ter um tempo de carregamento longo, que pode ter origem no utilizador ou no desenvolvimento.

Como fazer scraping de páginas de rolagem infinita usando Python

Vejamos como extrair páginas de deslocação infinita utilizando Python com a ajuda dos passos abaixo mencionados.

Importar bibliotecas

É necessário importar a biblioteca do Selenium.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys    
importar tempo

Configuração do Selenium

Aqui tem de escolher o browser que pretende utilizar. Vamos optar pelo Chrome, uma vez que oferece mais opções do que o Firefox. 

def get_selenium():                          
  options = webdriver.ChromeOptions()
  options.add_argument('--ignore-certificate-errors')
  options.add_argument('--incognito')
  options.add_argument('headless')                       
   driver = webdriver.Chrome(chrome_options=options)
  return (driver)

O argumento headless mencionado acima é muito importante. O Selenium não abrirá o Chrome em uma nova janela quando for executado sem cabeça em Python. No entanto, se você encontrar um problema durante o scraping, você pode comentar sobre a opção headless e ver o que está acontecendo no Chrome e o que é carregado na página.

Podemos omitir os dois sinalizadores i-e; ignore-certificate-errors e incognito.

Se encontrar um captcha ou um banner de cookie que impeça o carregamento da sua página, pode clicar em OK e prosseguir normalmente para a página. No entanto, se o browser for fechado inesperadamente, pode utilizar time.sleep() para fazer uma pausa no código e ter tempo suficiente para depurar.

Corrigir a deslocação infinita

É necessário analisar a estrutura HTML da sua página para corrigir a deslocação infinita e seguir os passos abaixo mencionados.

  • Tem de encontrar o último elemento carregado na página.
  • Tem de utilizar o Selenium para se deslocar para esse elemento.
  • Para aguardar que a página carregue mais conteúdo, utilize time.sleep().
  • Desloque-se novamente para o último elemento que foi carregado na página.
  • É necessário repetir o mesmo processo até chegar ao fim da página.

Pode considerar o exemplo abaixo para uma melhor compreensão.

selénio = get_selenium()              
selenium.get("your/url")   
last_elem = '';
while True:
   último_elemento_actual = "#meu-div > ul > li:último-filho"
   scroll = "document.querySelector(\'" + current_last_elem + "\').scrollIntoView();"
   selenium.execute_script(scroll)
   time.sleep(3)
  se (último_elem == actual_elem)
     pausa
  else
      último_elemento = elemento_actual

No código acima, utilizámos jQuery e Javascript dentro de Python. 

Aqui,

  • Utilizámos a função selenium.get() que abrirá a nossa página URL. No entanto, se quiser adicionar uma palavra-chave à sua pesquisa de URL, pode utilizar a seguinte linha de código.
selenium.get("seu/url.com/{0}".format(palavra-chave))
  • Inicializamos o last_time para 0, armazenando uma string vazia nele.
  • Utilizámos um ciclo while no qual utilizámos CSS_selector ou Xpath para obter o current_last_elem. Para obter o caminho, siga os passos abaixo. Abra a sua página. Para selecionar um elemento para o qual necessita do caminho, tem de utilizar ferramentas de desenvolvimento Web. Pode seguir este tutorial para selecionar o elemento na estrutura HTML da página e obter o Xpath no Chrome.
  • Abra a sua página.
  • Para selecionar um elemento para o qual necessita do caminho, tem de utilizar ferramentas de desenvolvimento Web. Pode seguir este tutorial para selecionar o elemento na estrutura HTML da página e obter o Xpath no Chrome.
  • Para deslocar a página para baixo até ao elemento selecionado, utilizámos jQuery e scrollIntoView(). 
"document.querySelector(\'" + .. + "\').scrollIntoView();"

Aqui, o seu formato deve estar correto, pelo que deve prestar atenção às aspas simples e duplas e aos caracteres de escape.

  • Executamos o script js utilizando selenium.execute_script().
  • É necessário dar à página tempo suficiente para carregar, para que possa encontrar o último elemento. Por isso, a função time.sleep() é importante, pois suspende a execução por alguns segundos. Se não der à página tempo suficiente para carregar, ela deixará de se deslocar e obterá um resultado indefinido.
  • Verificamos se é encontrado um novo último elemento sempre que descemos até ao fim da página. Se for encontrado, significa que ainda não chegámos ao fim da página e que temos de continuar a percorrer a página. Se não for encontrado, significa que a página terminou de rolar para baixo e podemos sair do loop.

Resolver problemas frequentes

Alguns dos problemas que ocorrem frequentemente quando se efectua o scrolling infinito são os seguintes

  • Demora algum tempo a encontrar o Xpath correto para o último elemento. É necessário verificar as aspas simples e duplas no script js.
  • Se obtiver indefinido ou o mesmo último elemento todas as vezes, é necessário aumentar a duração do tempo, ou seja, aumentar time.sleep(), pois a página pode não ter tempo suficiente para carregar completamente. 
  • Pode comentar a opção headless em get_selenium() se tudo estiver correto, mas mesmo assim não funciona.

Acionando js dentro do Python

É possível acionar um script js a partir do Python e obter uma lista como resultado. 

Por exemplo, podemos utilizar o código abaixo para obter as fontes de todas as imagens da página.

js_script = '''\    
var jslist = []  
document.querySelectorAll('img').forEach(i => jslist.push(i.src));
return jslist; 
 '' '   
python_list = selenium.execute_script(js_script)

No código acima,

  • Criámos uma matriz vazia chamada jslist.
  • Seleccionámos todas as etiquetas img na página.
  • Utilizámos o forEach para fazer avançar cada img.src na nossa matriz.
  • Devolvemos a jslist.

Podemos utilizar a mesma abordagem para as ligações href:

  • Seleção de todas as etiquetas "a".
  • Colocando todos os a.href na nossa matriz.

Depois, podemos executar o script com selenium.execute_script(). Podemos então armazenar o valor devolvido por js numa variável python, ou seja, python_list. 

É assim que podemos recolher páginas de deslocação infinita utilizando Python.

Utilizar um proxy

Você sabe que um proxy é um servidor de terceiros que atua como um intermediário entre um cliente que solicita um recurso e um servidor que fornece esse recurso. Se quiser usar proxies com Selenium e Python, pode usar as seguintes linhas de código.

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s'% hostname +": "+port)
driver = webdriver.Chrome(chrome_options=chrome_options)

Para lidar com a rolagem infinita, você pode usar o scroll-proxy que suporta a rolagem programática das exibições roláveis dentro de uma hierarquia de exibição. Se você usa o npm, pode instalar o scroll-proxy usando o comando abaixo. Usaremos o js para demonstrar o uso do scroll-proxy.

npm install scroll-proxy--save

Depois de instalar o scroll-proxy, pode instanciar um objeto ScrollProxy utilizando o código abaixo.

var myScroll = new ScrollProxy();

Pode ver que não passámos quaisquer argumentos para o construtor ScrollProxy porque este irá reportar acções por defeito quando o utilizador percorrer a página.

No entanto, se quiser obter actualizações quando o utilizador se desloca dentro de um elemento HTML específico, tem de o passar para o construtor.

var myDiv = document.querySelector('.scrollable');
var myDivScroll = new ScrollProxy(myDiv);

Porquê usar proxies para raspar o scrolling infinito?

Seguem-se algumas razões para utilizar proxies durante o scraping do scrolling infinito.

  • Um captcha pode causar um timeout na sua página e bloquear o seu scraper. Pode verificar manualmente a página para procurar um captcha se estiver a receber erros de timeout frequentes. A maioria dos captchas é accionada por medidas de segurança e pode evitá-los utilizando proxies residenciais rotativos juntamente com o seu scraper.
  • Alguns sítios preferem filtrar pedidos de cabeçalhos suspeitos com base no pressuposto ou na probabilidade de o agente do utilizador poder ser um bot. Para evitar a sinalização de que é um bot, pode utilizar proxies que podem alterar o seu endereço IP e evitar as bandeiras vermelhas para si (user-agent). 

Conclusão

Discutimos que o scrolling infinito é preferível quando o utilizador não está à procura de informações específicas. Os sítios Web de notícias e os feeds das redes sociais que geram constantemente novos conteúdos podem beneficiar da deslocação infinita. Por outro lado, as páginas de empresas e os sítios de comércio eletrónico não são bons candidatos para o scrolling infinito, uma vez que os utilizadores procuram informações específicas. Além disso, discutimos as etapas envolvidas na raspagem de páginas de rolagem infinita usando o Selenium. Também podemos usar proxies residenciais rotativos para lidar com a rolagem infinita, pois eles ajudam a evitar captchas e filtrar nossos pedidos de cabeçalho suspeitos.

Espero que tenha percebido como fazer scraping de páginas de scroll infinito usando Python.