Como Scrape Páginas de rolagem infinita usando Python

Como fazer, Python, Scraping, Nov. -15-20225 minutos de leitura

No mundo atual, todos fazem uso de novas tecnologias. Você pode obter acesso aos dados estruturados de forma automatizada com a ajuda da Web scraping. Por exemplo, você pode usar a Web scraping para: A rolagem infinita, também conhecida como rolagem sem fim, é uma técnica de design da Web que os sites geralmente usam com AJAX ou Javascript

Índice

No mundo atual, todos fazem uso de novas tecnologias. Você pode obter acesso aos dados estruturados de forma automatizada com a ajuda da Web scraping. Por exemplo, você pode usar a Web scraping para:

  • Monitoramento de preços
  • Geração de leads
  • Monitoramento de notícias
  • Pesquisa de mercado
  • Inteligência de preços

A rolagem infinita, também conhecida como rolagem sem fim, é uma técnica de web design que os sites costumam usar com AJAX ou Javascript para carregar conteúdo adicional dinamicamente quando o usuário rola até a parte inferior da página da Web. Essa técnica ganhou popularidade devido ao seu sucesso em sites de mídia social. Por exemplo, a rolagem infinita no Twitter é produzida por meio de carregamento assíncrono. O Twitter faz chamadas AJAX depois que a página é carregada para adicionar continuamente novo conteúdo à medida que ela rola. Embora a rolagem infinita tenha muitas vantagens, ela não é recomendada para tarefas de localização orientadas por objetivos que exigem que as pessoas localizem um conteúdo específico.

Primeiro, vamos entender os benefícios das páginas de rolagem infinita do scraping .

Por que você precisa Scrape Páginas de rolagem infinita?

Veja a seguir alguns dos motivos para scrape páginas de rolagem infinita.

  • Envolvimento do usuário - A rolagem infinita mantém os usuários envolvidos em uma página. Há toneladas de conteúdo gerado pelo usuário para percorrer em sites de mídia social como Twitter e Facebook, de modo que o usuário está constantemente envolvido. 
  • Menos cliques - A rolagem requer menos ação e é mais fácil para os usuários do que clicar.
  • Ideal para dispositivos móveis - a rolagem infinita é excelente para dispositivos móveis e telas sensíveis ao toque. Os usuários podem deslizar para baixo para gerar novo conteúdo em vez de alternar para novas guias. 

Além dos benefícios acima das páginas de rolagem infinita do scraping , há também alguns contras, como

  • Isso não é bom para a otimização de mecanismos de pesquisa (SEO).
  • Não é fácil para os usuários com deficiências físicas navegarem pelas páginas que têm rolagem infinita.
  • Os sites de rolagem infinita podem ter um longo tempo de carregamento, que pode vir do usuário ou do desenvolvimento.

Como Scrape Páginas de rolagem infinita usando Python

Vamos ver como scrape páginas de rolagem infinita usando Python com a ajuda das etapas mencionadas abaixo.

Importar bibliotecas

Você precisa importar a biblioteca do Selenium.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys    
import time

Configuração do Selenium

Aqui você deve escolher o navegador que deseja usar. Optaremos pelo Chrome, pois ele 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 sem cabeça mencionado acima é muito importante. O Selenium não abrirá o Chrome em uma nova janela quando for executado sem cabeça no Python. No entanto, se você encontrar um problema em scraping, poderá comentar sobre a opção headless e ver o que está acontecendo no Chrome e o que está carregado na página.

Podemos omitir os dois sinalizadores, ou seja, ignore-certificate-errors e incognito.

Se você encontrar um captcha ou um banner cookie que impeça o carregamento da página, poderá clicar em OK e prosseguir para a página normalmente. Entretanto, se o navegador for fechado inesperadamente, você poderá usar time.sleep() para pausar o código e ter tempo suficiente para depurar.

Correção da rolagem infinita

Você precisa examinar a estrutura HTML da sua página para corrigir a rolagem infinita e seguir as etapas mencionadas abaixo.

  • Você precisa encontrar o último elemento carregado na página.
  • Você precisa usar o Selenium para rolar para baixo até esse elemento.
  • Para esperar que a página carregue mais conteúdo, use time.sleep().
  • Role novamente até o último elemento que foi carregado na página.
  • Você precisa repetir o mesmo processo até chegar ao final da página.

Você pode considerar o exemplo abaixo para entender melhor.

selênio = get_selenium()              
selenium.get("your/url")   
last_elem = '';
while True:
   current_last_elem = "#my-div > ul > li:last-child"
   scroll = "document.querySelector(\'" + current_last_elem + "\').scrollIntoView();"
   selenium.execute_script(scroll)
   time.sleep(3)
  se (último_elem == atual_elem)
     pausa
  else
      last_elem = current_elem

No código acima, usamos jQuery e Javascript dentro do Python. 

Aqui,

  • Usamos a função selenium.get() que abrirá nossa página de URL. No entanto, se quiser adicionar uma palavra-chave à sua pesquisa de URL, você pode usar a seguinte linha de código.
selenium.get("your/url.com/{0}".format(keyword))
  • Inicializamos o last_time como 0 armazenando uma string vazia nele.
  • Usamos um loop while no qual usamos CSS_selector ou Xpath para obter o current_last_elem. Para obter o caminho, siga as etapas abaixo. Abra sua página. Para selecionar um elemento para o qual você precisa do caminho, é necessário usar as ferramentas de desenvolvimento da Web. Você pode seguir este tutorial para selecionar o elemento na estrutura HTML da página e obter o Xpath no Chrome.
  • Abra sua página.
  • Para selecionar um elemento para o qual você precisa do caminho, é necessário usar ferramentas de desenvolvimento da Web. Você pode seguir este tutorial para selecionar o elemento na estrutura HTML da página e obter o Xpath no Chrome.
  • Para rolar a página para baixo até o elemento selecionado, usamos jQuery e scrollIntoView(). 
"document.querySelector(\'" + .. + "\'').scrollIntoView();"

Aqui, seu formato deve estar correto, portanto, você precisa prestar atenção às aspas simples e duplas e aos caracteres de escape.

  • Executamos o script js usando selenium.execute_script().
  • Você precisa dar à página tempo suficiente para carregar, de modo que ela possa encontrar o último elemento. Portanto, a função time.sleep() é importante, pois suspende a execução por alguns segundos. Se você não der à página tempo suficiente para carregar, ela interromperá a rolagem e você obterá um resultado indefinido.
  • Verificamos se um novo último elemento é encontrado toda vez que rolamos para baixo até o final da página. Se ele for encontrado, significa que ainda não chegamos ao final da página e precisamos continuar a rolagem. Se não for encontrado, significa que a página terminou de rolar para baixo e podemos sair do loop.

Correção de problemas frequentes

Alguns dos problemas que ocorrem com frequência ao fazer a rolagem infinita são os seguintes:

  • Leva algum tempo para encontrar o Xpath correto para o último elemento. Você precisa verificar as aspas simples e duplas no script js.
  • Se você obtiver um elemento indefinido ou o mesmo último elemento todas as vezes, será 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. 
  • Você pode comentar a opção headless em get_selenium() se tudo estiver correto, mas ainda assim não funciona.

Acionamento de js no Python

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

Por exemplo, podemos usar 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,

  • Criamos uma matriz vazia chamada jslist.
  • Selecionamos todas as tags img na página.
  • Usamos o forEach para enviar cada img.src em nossa matriz.
  • Devolvemos a jslist.

Podemos usar a mesma abordagem para os links href:

  • Selecionando todas as tags "a".
  • Empurrando cada a.href para nossa matriz.

Depois disso, podemos executar o script com selenium.execute_script(). Em seguida, podemos armazenar o valor retornado por js em uma variável python, ou seja, python_list. 

É assim que podemos scrape páginas de rolagem infinita usando Python.

Usando um Proxy

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

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

Para lidar com a rolagem infinita, você pode usar o scroll-proxy que oferece suporte à rolagem programática das exibições roláveis em uma hierarquia de exibição. Se você usar o npm, poderá 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, você pode instanciar um objeto ScrollProxy usando o código abaixo.

var myScroll = new ScrollProxy();

Você pode ver que não passamos nenhum argumento para o construtor do ScrollProxy porque ele relatará ações por padrão quando o usuário rolar a página.

No entanto, se quiser obter atualizações quando o usuário rolar a tela dentro de algum elemento HTML específico, será necessário passá-lo para o construtor.

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

Por que usar Proxies para Scraping rolagem infinita?

Abaixo estão alguns motivos para usar proxies enquanto scraping rolagem infinita.

  • Um captcha pode causar o tempo limite da página e bloquear seu scraper. Você pode verificar manualmente a página para procurar um captcha se estiver recebendo erros frequentes de tempo limite. A maioria dos captchas é acionada por medidas de segurança, e você pode evitá-los usando o proxies residencial rotativo junto com o seu scraper.
  • Alguns sites preferem filtrar solicitações de cabeçalho suspeitas com base na suposição ou na probabilidade de que o agente do usuário possa ser um bot. Para evitar a sinalização de que você é um bot, você pode usar o proxies que pode alterar seu endereço IP e evitar os sinais de alerta para você (user-agent). 

Conclusão

Discutimos que a rolagem infinita é preferível quando o usuário não está procurando informações específicas. Sites de notícias e feeds de mídia social que geram constantemente novos conteúdos podem se beneficiar da rolagem infinita. Por outro lado, páginas de negócios e sites de comércio eletrônico não são bons candidatos para a rolagem infinita, pois os usuários buscam informações específicas. Além disso, discutimos as etapas envolvidas em scraping páginas de rolagem infinita usando o Selenium. Também podemos usar o rotativo residencial proxies para lidar com a rolagem infinita, pois ele ajuda a evitar captchas e filtra nossas solicitações de cabeçalho suspeitas.

Espero que você tenha entendido como scrape páginas de rolagem infinita usando Python.