Tácticas avançadas de Web Scraping em Python

Comentários: 0

A recolha de dados de um sítio Web é muito mais do que a simples recolha do seu conteúdo; há muita coisa envolvida. Para contornar limites, lacunas e outros bloqueios sofisticados, é necessário utilizar uma série de métodos adicionais, como a recolha de dados Python.

Neste artigo, vamos definir o que é o Python scraping e justificar por que razão é a ferramenta ideal para a tarefa. E também delinear tácticas que fazem uso das capacidades de raspagem de dados Python. Tudo isso ajudará a recuperar informações até mesmo dos sites mais seguros.

Porque é que Python é ideal para Web Scraping

Esta ferramenta foi especificamente concebida para servir como um excelente recurso para a recolha de dados de sítios Web. Para além da sua facilidade de utilização, as bibliotecas Python, como Scrapy, Selenium e BeautifulSoup, são extremamente poderosas. Além disso, existe uma nova comunidade ativa que continua a desenvolver scripts e a prestar apoio a novos utilizadores. É por isso que o Python é atualmente utilizado para a recolha de dados da Web. Assim, vamos destacar as principais estratégias disponíveis neste momento.

Tácticas de recolha de dados com Python

Este bloco mostrará ao utilizador como fazer scraping de websites complexos utilizando técnicas mais sofisticadas incorporadas no Python. O utilizador aprenderá a:

  • Evite ser bloqueado pela proteção de bots - lide com CAPTCHA, honeypots e impressão digital TLS.
  • Agir como um utilizador real para evitar ser bloqueado.
  • Controle os cookies e as sessões para se manter autenticado enquanto acede a páginas restritas.
  • Gerir dados obtidos a partir de APIs e tratar dados carregados de forma assíncrona.
  • Proteja o script de modificações na página e refine a lógica para recursos dinâmicos.

Estas abordagens ajudariam a tornar eficaz a recolha de dados Python, minimizando as hipóteses de bloqueio ou recusa de acesso ao servidor.

Agora, vamos prosseguir com as tácticas sobre como fazer scraping em Python de uma forma eficaz.

Tática 1: Lidar com CAPTCHAs e medidas anti-bot

Uma infinidade de sítios Web implementa sistemas de segurança CAPTCHA como uma excelente linha de defesa para proteger as suas informações contra a recolha premeditada de dados do Python. Esses sistemas podem ser vencidos de várias formas, empregando serviços de reconhecimento automático, como o 2Captcha ou o Anti-Captcha, ou utilizando a aprendizagem automática para identificar cognitivamente as imagens. Outra possibilidade é reduzir a quantidade de consultas a um nível que o tribunal não associe à expetativa de recolha de informações.

Tática 2: Emular o comportamento humano

Para tornar as consultas menos hostis, os utilizadores devem agir de uma forma mais próxima do comportamento normal. Introduzir tempos aleatórios entre acções, mudar de User-Agent, percorrer a página, mover o ponteiro do rato, simular a escrita e muito mais. A utilização do Selenium ou do Playwright como ferramentas de raspagem Python dá à automatização caraterísticas muito mais semelhantes às humanas, de modo a evitar bloqueios.

  • Alterar o User-Agent:
    
    import random
    import requests
    
    url = 'https://google.com'
    
    user_agents = [
       'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
       'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    ]
    headers = {
       'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
       'accept-language': 'en-IN,en;q=0.9',
       'dnt': '1',
       'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
       'sec-ch-ua-mobile': '?0',
       'sec-ch-ua-platform': '"Linux"',
       'sec-fetch-dest': 'document',
       'sec-fetch-mode': 'navigate',
       'sec-fetch-site': 'none',
       'sec-fetch-user': '?1',
       'upgrade-insecure-requests': '1',
    }
    
    
    headers['user-agent'] = random.choice(user_agents)
    response = requests.get(url=url, headers=headers)
    
    
    
  • Movimento do cursor:
    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.action_chains import ActionChains
    
    options = webdriver.ChromeOptions()
    options.add_argument("--headless")  # Executar o browser sem uma interface gráfica
    driver = webdriver.Chrome(options=options)
    
    driver.get("https://google.com")
    
    # Procurar um elemento por XPath
    element = driver.find_element(By.XPATH, "//button[text()=Confirm]")
    
    # Utilizar ActionChains para mover o cursor
    actions = ActionChains(driver)
    actions.move_to_element(element).perform()
    
    # Fechar o browser
    driver.quit()
    
    
    

Tática 3: Evitar armadilhas Honeypot

Alguns sítios Web incorporam elementos adicionais concebidos para utilizadores regulares que são invisíveis, mas que um bot pode acionar acidentalmente. Estes elementos incluem formulários ocultos, em que o facto de clicar e submetê-los fará com que o sítio bloqueie o acesso do bot. Antes da recolha de dados, utilize estilos e atributos CSS como display: none ou opacity: 0 e evite ativar esses estilos.

Tática 4: Gerir cookies e sessões

Se os pedidos forem efectuados sem os cookies corretos ou a configuração da sessão, alguns sítios bloquearão pedidos repetidos que sejam considerados demasiado simples. Para contornar este problema, utilize requests.Session(), utilize cookies guardados e actue como um utilizador genuíno. Também é necessário alterar os cabeçalhos User-Agent, uma vez que o bot vai ser reconhecido por eles.

Tática 5: Implementando backoff exponencial para novas tentativas de solicitação para raspagem de dados em Python

Caso o servidor não responda ou devolva temporariamente um erro, faça uma pausa antes de efetuar novas tentativas de repetir o comando. O backoff exponencial é mais preferível - refere-se ao aumento do tempo de espera após cada tentativa falhada. Por exemplo, pode ser aumentado em 1 segundo, 2 segundos, depois 4 segundos, etc. Isso diminui a chance de ser bloqueado, minimizando as limitações do site e diminuindo a carga de trabalho de raspagem de dados com Python.


import time
import requests


def fetch_with_backoff(url, max_retries=5):
   retries = 0
   wait_time = 1  # Atraso de 1 segundo

   while retries < max_retries:
       try:
           response = requests.get(url)

           # Se o pedido for bem sucedido, devolve o resultado
           if response.status_code == 200:
               return response.text

           print(f"Error {response.status_code}. Retrying in {wait_time} sec.")

       except requests.exceptions.RequestException as e:
           print(f"Connection error: {e}. Retrying in {wait_time} sec.")

       # Esperar antes de tentar de novo
       time.sleep(wait_time)

       # Aumentar o atraso
       wait_time *= 2
       retries += 1

   return None


url = "https://google.com"
html = fetch_with_backoff(url)


Tática 6: Utilizar navegadores sem cabeça para interações complexas

Alguns sítios Web podem carregar o conteúdo por fases, ou podem funcionar apenas depois de receberem alguns dados do utilizador. Nesses casos, é improvável que bibliotecas como a BeautifulSoup ajudem. Neste caso, o web scraping com Selenium, Puppeteer e Playwright ajudará. Permitem-lhe abrir páginas como um utilizador normal o faria, o que significa que pode clicar em botões, escrever texto e interagir com elementos da página.

Tática 7: Raspagem de dados Python a partir de carregamento assíncrono

Há algumas páginas Web que não utilizam JavaScript para mostrar dados até que um utilizador tenha acedido à página Web. Com isso, uma solicitação HTTP padrão não obterá todas as informações necessárias. O Selenium pode ser usado para reunir essas informações, ou as solicitações de rede podem ser examinadas usando o DevTools do navegador. Isso ajuda na deteção de pontos de extremidade de API ocultos, que podem ser utilizados posteriormente para a recuperação de informações com o mínimo de problemas.

Tática 8: Detetar e evitar a impressão digital de TLS

A esmagadora maioria dos sítios Web passa os pedidos automatizados para o servidor para processamento posterior. É sabido que alguns sítios Web verificam as impressões digitais TLS como forma de distinguir os pedidos automatizados. Isto significa que o servidor estuda vários atributos de ligação como a atenção TLS/SSL utilizando tecnologia, cifras e outras ligações sofisticadas. Para o conseguir, pode misturar atributos de ligação nos pedidos utilizando cabeçalhos e proxies personalizados.

  • Integração de proxies:
    
    import requests
    
    url = 'username:password@your-proxy'
    
    proxy = 'your-proxy'
    proxies = {
       "http": f"http://{proxy}",
       "https": f"https://{proxy}",
    }
    response = requests.get(url=url, proxies=proxies)
    
    
    

Tática 9: Tirar partido dos pontos finais da API quando disponíveis

Se um sítio Web oferecer uma API pública, é aconselhável utilizá-la em vez de recorrer à recolha de dados. Esta abordagem é mais rápida, mais fiável e tem menos probabilidades de ser bloqueada. Um bom ponto de partida para encontrar um ponto de extremidade da API é verificar os pedidos que o site faz, o que é visível no DevTools. Na ausência de uma API, terá de trabalhar com o código HTML.

Tática 10: Monitorizar alterações na estrutura do sítio Web

Os sítios Web podem modificar o seu código, o que pode atrasar a sua recolha. Como contrapartida, considere o seguinte:

  • Mudar da utilização de selectores CSS para XPath;
  • Utilize testes automatizados para monitorizar periodicamente a estrutura da página;
  • Crie código inteligente que possa lidar com alterações prováveis. Uma forma de o fazer é procurar elementos pelo seu conteúdo e não por caminhos pré-determinados.

Tática 11: Garantir a conformidade com as condições de serviço do sítio Web

Em alguns casos, a recolha de dados com Python de sítios Web pode violar os respectivos termos de utilização ou mesmo ser considerada ilegal em determinadas jurisdições. É imperativo examinar o robots.txt e os termos de serviço juntamente com a política do site antes de extrair dados. Também é melhor usar uma API pública, se houver uma disponível. Além disso, defina limites para o número de pedidos para minimizar a pressão sobre o servidor.

Raspagem de dados em Python: Conclusão

O web scraping avançado com Python tem suas próprias vantagens, mas fazê-lo da maneira correta também é igualmente importante. Discutimos aspectos importantes desse processo no que diz respeito a contornar o CAPTCHA, simular acções do utilizador, gerir cookies e sessões, lidar com honeypots e examinar dados em aplicações Web assíncronas.

Além disso, tenha em conta o aspeto moral e o acordo relevante do sítio utilizado. Utilize os pontos de extremidade da API quando disponíveis e, se a análise de HTML for inevitável, siga todas as diretrizes para reduzir as hipóteses de ser bloqueado e de ter complicações legais.

Com a utilização deste tutorial sobre métodos de raspagem da web com Python, o potencial de risco pode ser bastante reduzido, enquanto a eficácia pode ser aumentada ao máximo.

Comentários:

0 Comentários