socialgekon.com
  • Principal
  • Inovação
  • Pesquisar
  • Mundo
  • Nutrição
Tecnologia

Web Scraping moderno com Python e Selenium

Web scraping tem sido usado para extrair dados de sites quase desde o nascimento da World Wide Web. No início, a coleta era feita principalmente em páginas estáticas - aquelas com elementos, tags e dados conhecidos.

Mais recentemente, no entanto, tecnologias avançadas de desenvolvimento web tornaram a tarefa um pouco mais difícil. Neste artigo, vamos explorar como podemos fazer para extrair dados caso uma nova tecnologia e outros fatores impeçam a remoção padrão.

Extração de dados tradicional

Como a maioria dos sites produz páginas destinadas à legibilidade humana em vez de leitura automatizada, o web scraping consistia principalmente em digerir programaticamente os dados de marcação de uma página da web (pense em clicar com o botão direito, Exibir código-fonte) e, em seguida, detectar padrões estáticos nesses dados que permitiriam o programa para “ler” várias informações e salvá-las em um arquivo ou banco de dados.



Data Scraping

Se os dados do relatório fossem encontrados, muitas vezes, os dados seriam acessíveis passando variáveis ​​de formulário ou parâmetros com o URL. Por exemplo:

https://www.myreportdata.com?month=12&year=2004&clientid=24823

Python se tornou uma das linguagens de scraping da web mais populares devido em parte às várias bibliotecas da web que foram criadas para ele. Uma biblioteca popular, Sopa linda , foi projetado para extrair dados de arquivos HTML e XML, permitindo pesquisar, navegar e modificar tags (ou seja, a árvore de análise).

Scraping baseado em navegador

Recentemente, tive um projeto de raspagem que parecia bastante direto e estava totalmente preparado para usar a raspagem tradicional para lidar com ele. Mas, à medida que fui avançando, encontrei obstáculos que não podiam ser superados com os métodos tradicionais.

Três problemas principais me impediram de meus métodos de raspagem padrão:

  1. Certificado. Era necessário instalar um certificado para acessar a parte do site onde os dados estavam. Ao acessar a página inicial, apareceu um prompt solicitando que eu selecione o certificado adequado dos instalados no meu computador e clique em OK.
  2. Iframes. O site usava iframes, o que atrapalhou minha leitura normal. Sim, eu poderia tentar encontrar todos os URLs de iframe e construir um mapa do site, mas parecia que poderia ficar complicado.
  3. JavaScript. Os dados foram acessados ​​após o preenchimento de um formulário com parâmetros (por exemplo, ID do cliente, intervalo de datas, etc.). Normalmente, eu ignoraria o formulário e simplesmente passaria as variáveis ​​do formulário (via URL ou como variáveis ​​ocultas do formulário) para a página de resultados e veria os resultados. Mas, neste caso, o formulário continha JavaScript, o que não me permitiu acessar as variáveis ​​do formulário de maneira normal.

Então, decidi abandonar meus métodos tradicionais e olhar para uma possível ferramenta para scraping baseado em navegador. Isso funcionaria de maneira diferente do normal - em vez de ir diretamente para uma página, fazer o download da árvore de análise e retirar os elementos de dados, eu 'agiria como um humano' e usaria um navegador para chegar à página de que precisava e, em seguida, raspar o dados - contornando assim a necessidade de lidar com as barreiras mencionadas.

Selênio

Em geral, Selênio é conhecido como uma estrutura de teste de código aberto para aplicativos da web - permitindo Especialistas em controle de qualidade para realizar testes automatizados, reproduzir reproduções e implementar a funcionalidade de controle remoto (permitindo muitas instâncias do navegador para teste de carga e vários tipos de navegador). No meu caso, parecia que poderia ser útil.

Minha linguagem preferida para web scraping é o Python, já que tem bibliotecas bem integradas que geralmente podem lidar com todas as funcionalidades necessárias. E com certeza, um Biblioteca Selenium existe para Python. Isso me permitiria instanciar um “navegador” - Chrome, Firefox, IE, etc. - e fingir que estava usando o navegador para obter acesso aos dados que procurava. E se eu não quisesse que o navegador realmente aparecesse, poderia criá-lo no modo “headless”, tornando-o invisível para qualquer usuário.

Configuração do Projeto

Para começar a experimentar, eu precisava configurar meu projeto e obter tudo o que precisava. Usei uma máquina Windows 10 e verifiquei se tinha uma versão Python relativamente atualizada (era a v. 3.7.3). Eu criei um script Python em branco e carreguei as bibliotecas que pensei que seriam necessárias, usando PIP (instalador de pacote para Python) se ainda não tivesse a biblioteca carregada. Estas são as principais bibliotecas com as quais comecei:

  1. solicitações de (para fazer solicitações HTTP)
  2. URLLib3 (Manipulação de URL)
  3. Sopa linda (no caso de Selenium não conseguir lidar com tudo)
  4. Selênio (para navegação baseada em navegador)

Também adicionei alguns parâmetros de chamada ao script (usando a biblioteca argparse) para poder brincar com vários conjuntos de dados, chamando o script da linha de comando com opções diferentes. Esses incluíam ID do cliente, mês / ano e mês / ano.

Problema 1 - O Certificado

A primeira escolha que eu precisava fazer era qual navegador eu diria ao Selenium para usar. Como geralmente uso o Chrome, e ele é baseado no projeto de código aberto Chromium (também usado pelos navegadores Edge, Opera e Amazon Silk), pensei em tentar isso primeiro.

Consegui iniciar o Chrome no script adicionando os componentes da biblioteca de que precisava e emitindo alguns comandos simples:

# Load selenium components from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait, Select from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException # Establish chrome driver and go to report site URL url = 'https://reportdata.mytestsite.com/transactionSearch.jsp' driver = webdriver.Chrome() driver.get(url)

Como não iniciei o navegador no modo headless, o navegador realmente apareceu e pude ver o que estava fazendo. Imediatamente, ele me pediu para selecionar um certificado (que eu havia instalado anteriormente).

O primeiro problema a resolver foi o certificado. Como selecionar o adequado e aceitá-lo para entrar no site? Em meu primeiro teste do script, recebi este prompt:

Data Scraping

Isso não era bom. Eu não queria clicar manualmente no botão OK sempre que executava meu script.

Acontece que consegui encontrar uma solução alternativa para isso - sem programação. Embora eu esperasse que o Chrome pudesse passar um nome de certificado na inicialização, esse recurso não existia. No entanto, o Chrome tem a capacidade de selecionar automaticamente um certificado se uma determinada entrada existir no registro do Windows. Você pode configurá-lo para selecionar o primeiro certificado que ele vê, ou então ser mais específico. Como eu tinha apenas um certificado carregado, usei o formato genérico.

Data Scraping

Assim, com esse conjunto, quando eu disse ao Selenium para iniciar o Chrome e um prompt de certificado apareceu, o Chrome “AutoSelecionou” o certificado e continuou.

Problema 2 - Iframes

Ok, agora eu estava no site e um formulário apareceu, solicitando-me a digitar o ID do cliente e o intervalo de datas do relatório.

Data Scraping

Ao examinar o formulário nas ferramentas de desenvolvedor (F12), percebi que o formulário foi apresentado dentro de um iframe. Portanto, antes de começar a preencher o formulário, precisei “mudar” para o iframe adequado onde o formulário existia. Para fazer isso, invoquei o recurso switch-to do Selenium, assim:

# Switch to iframe where form is frame_ref = driver.find_elements_by_tag_name('iframe')[0] iframe = driver.switch_to.frame(frame_ref)

Bom, agora no quadro certo, consegui determinar os componentes, preencher o campo de ID do cliente e selecionar os menus suspensos de data:

# Find the Customer ID field and populate it element = driver.find_element_by_name('custId') element.send_keys(custId) # send a test id # Find and select the date drop-downs select = Select(driver.find_element_by_name('fromMonth')) select.select_by_visible_text(from_month) select = Select(driver.find_element_by_name('fromYear')) select.select_by_visible_text(from_year) select = Select(driver.find_element_by_name('toMonth')) select.select_by_visible_text(to_month) select = Select(driver.find_element_by_name('toYear')) select.select_by_visible_text(to_year)

Problema 3 - JavaScript

A única coisa que restou no formulário foi “clicar” no botão Localizar, para que a pesquisa fosse iniciada. Isso foi um pouco complicado, pois o botão Localizar parecia ser controlado por JavaScript e não era um botão do tipo 'Enviar' normal. Inspecionando-o nas ferramentas do desenvolvedor, encontrei a imagem do botão e consegui obter o XPath dele, clicando com o botão direito.

Data Scraping

Então, munido dessas informações, encontrei o elemento na página e cliquei nele.

# Find the ‘Find’ button, then click it driver.find_element_by_xpath('/html/body/table/tbody/tr[2]/td[1]/table[3]/tbody/tr[2]/td[2]/input').click()

E voilà, o formulário foi enviado e os dados apareceram! Agora, eu poderia simplesmente copiar todos os dados na página de resultados e salvá-los conforme necessário. Ou eu poderia?

Obtendo os dados

Primeiro, eu tive que lidar com o caso em que a pesquisa não encontrou nada. Isso foi muito simples. Ele exibiria uma mensagem no formulário de pesquisa sem sair, algo como 'Nenhum registro foi encontrado.' Eu simplesmente procurei por aquela string e parei ali mesmo se a encontrasse.

Mas se os resultados chegassem, os dados eram apresentados em divs com um sinal de mais (+) para abrir uma transação e mostrar todos os seus detalhes. Uma transação aberta mostrou um sinal de menos (-) que, quando clicado, fecharia o div. Clicar em um sinal de mais chamaria um URL para abrir seu div e fechar qualquer um aberto.

Data Scraping

Assim, era necessário encontrar quaisquer sinais de mais na página, reunir a URL ao lado de cada um e, em seguida, percorrer cada um para obter todos os dados de cada transação.

# Loop through transactions and count links = driver.find_elements_by_tag_name('a') link_urls = [link.get_attribute('href') for link in links] thisCount = 0 isFirst = 1 for url in link_urls: if (url.find('GetXas.do?processId') >= 0): # URL to link to transactions if isFirst == 1: # already expanded + isFirst = 0 else: driver.get(url) # collapsed +, so expand # Find closest element to URL element with correct class to get tran type tran_type=driver.find_element_by_xpath('//*[contains(@href,'/retail/transaction/results/GetXas.do?processId=-1')]/following::td[@class='txt_75b_lmnw_T1R10B1']').text # Get transaction status status = driver.find_element_by_class_name('txt_70b_lmnw_t1r10b1').text # Add to count if transaction found if (tran_type in ['Move In','Move Out','Switch']) and (status == 'Complete'): thisCount += 1

No código acima, os campos que recuperei eram o tipo de transação e o status, depois adicionados a uma contagem para determinar quantas transações se encaixam nas regras que foram especificadas. No entanto, eu poderia ter recuperado outros campos nos detalhes da transação, como data e hora, subtipo, etc.

Para este projeto, a contagem foi retornada para um aplicativo de chamada. No entanto, ele e outros dados extraídos podem ter sido armazenados em um arquivo simples ou em um banco de dados.

Possíveis Roadblocks e Soluções Adicionais

Vários outros obstáculos podem ser apresentados durante a remoção de sites modernos com sua própria instância do navegador, mas a maioria pode ser resolvida. Aqui estão alguns:

  • Tentando encontrar algo antes que apareça

    Ao navegar por si mesmo, com que frequência você descobre que está esperando uma página aparecer, às vezes por vários segundos? Bem, o mesmo pode ocorrer durante a navegação programada. Você procura uma classe ou outro elemento - e não está lá!

    Felizmente, o Selenium tem a capacidade de esperar até ver um determinado elemento e pode atingir o tempo limite se o elemento não aparecer, assim:

element = WebDriverWait(driver, 10). until(EC.presence_of_element_located((By.ID, 'theFirstLabel')))


  • Passando por um Captcha

    Alguns sites empregam Captcha ou similar para prevenir robôs indesejados (que eles podem considerar você). Isso pode prejudicar a raspagem da teia e retardá-la.

Para solicitações simples (como 'o que é 2 + 3?'), Geralmente podem ser lidas e descobertas facilmente. No entanto, para barreiras mais avançadas, existem bibliotecas que podem ajudar a tentar quebrá-lo. Alguns exemplos são 2Captcha , Morte por Captcha e Ignorar captcha .

  • Mudanças estruturais do site

    Os sites devem mudar - e costumam mudar. É por isso que, ao escrever um script de rascunho, é melhor manter isso em mente. Você vai querer pensar sobre quais métodos usará para encontrar os dados e quais não usar. Considere técnicas de correspondência parcial, em vez de tentar corresponder uma frase inteira. Por exemplo, um site pode alterar uma mensagem de “Nenhum registro encontrado” para “Nenhum registro localizado” - mas se a sua correspondência for “Nenhum registro”, você deve estar bem. Além disso, considere se deve corresponder no XPATH, ID, nome, texto do link, tag ou nome da classe ou seletor CSS - e que é menos provável de ser alterado.

Resumo: Python e Selenium

Esta foi uma breve demonstração para mostrar que quase todos os sites podem ser danificados, não importa quais tecnologias são usadas e quais complexidades estão envolvidas. Basicamente, se você pode navegar no site sozinho, geralmente pode ser apagado.

Agora, como advertência, isso não significa que todo site devemos ser raspado. Alguns têm restrições legítimas, e tem havido inúmeras casos de tribunal decidir a legalidade da remoção de certos sites. Por outro lado, alguns sites acolhem e incentivam os dados a serem recuperados de seus sites e, em alguns casos, fornecem uma API para facilitar as coisas.

De qualquer forma, é melhor verificar os termos e condições antes de iniciar qualquer projeto. Mas se você for em frente, tenha certeza de que pode fazer o trabalho.

Recursos recomendados para extração complexa da Web:

  • Scraping avançado em Python: Melhores práticas e soluções alternativas
  • Raspagem escalável do-it-yourself: Como construir e operar raspadores em grande escala

Compreender o básico

Por que o Python é usado para web scraping?

Python se tornou a linguagem mais popular para web scraping por uma série de razões. Isso inclui flexibilidade, facilidade de codificação, tipagem dinâmica, grande coleção de bibliotecas para manipular dados e suporte para as ferramentas de raspagem mais comuns, como Scrapy, Beautiful Soup e Selenium.

É legal raspar um site?

O scraping da Web não é ilegal. A maioria dos dados em sites é destinada ao consumo público. No entanto, alguns sites têm termos e condições que proíbem expressamente o download de dados. A coisa mais segura a fazer é considerar as restrições postadas por qualquer site específico e estar ciente da propriedade intelectual de terceiros.

Qual é a diferença entre Beautiful Soup e Selenium?

Beautiful Soup é uma biblioteca Python construída especificamente para extrair dados de arquivos HTML ou XML. O Selenium, por outro lado, é uma estrutura para testar aplicativos da web. Ele permite instanciar uma instância do navegador usando um driver e, em seguida, usa comandos para navegar no navegador como se fosse manualmente.

O que é um navegador sem cabeça?

Um navegador sem cabeça é basicamente um navegador sem uma interface de usuário que pode ser criada programaticamente. Os comandos podem ser emitidos para navegar no navegador, mas nada pode ser visto enquanto o navegador existe.

O que é um XPATH?

XPATH (XML Path Language) é uma sintaxe específica que pode ser usada para navegar por arquivos HTML ou XML identificando e navegando em nós. É baseado em uma representação em árvore do documento. Aqui está um exemplo XPATH que denota o nome do primeiro produto no elemento produtos: / produtos / produto [1] / nome

Buscar e analisar o alto uso da CPU em aplicativos .NET

Processo Interno

Buscar e analisar o alto uso da CPU em aplicativos .NET
Conluio: Rede de Dispositivos Próximos com MultipeerConnectivity no iOS

Conluio: Rede de Dispositivos Próximos com MultipeerConnectivity no iOS

Móvel

Publicações Populares
Compreendendo as nuances da classificação de fontes
Compreendendo as nuances da classificação de fontes
Uma 'reforma da mamãe' pode trazer de volta seu corpo antes da gravidez? Descobrir
Uma 'reforma da mamãe' pode trazer de volta seu corpo antes da gravidez? Descobrir
AI Investment Primer: A Practical Guide to Appraising Artificial Intelligence Dealflow (Parte II)
AI Investment Primer: A Practical Guide to Appraising Artificial Intelligence Dealflow (Parte II)
O guia avançado para otimizar o desempenho do WordPress
O guia avançado para otimizar o desempenho do WordPress
Recrutador Júnior
Recrutador Júnior
 
Cuidado com o vento: opiniões sobre o boom de crescimento das energias renováveis
Cuidado com o vento: opiniões sobre o boom de crescimento das energias renováveis
Gandhis, BJP, nacionalismo divisivo: o que Barack Obama diz sobre a Índia nas memórias
Gandhis, BJP, nacionalismo divisivo: o que Barack Obama diz sobre a Índia nas memórias
Os segredos da fotografia de rua sincera no seu iPhone
Os segredos da fotografia de rua sincera no seu iPhone
Como obter o equilíbrio de branco adequado em suas fotos do iPhone
Como obter o equilíbrio de branco adequado em suas fotos do iPhone
Mulher de origem indiana presa em Cingapura por trapacear como agente de viagens
Mulher de origem indiana presa em Cingapura por trapacear como agente de viagens
Categorias
Dicas E FerramentasDesign De IuNoticias Do MundoProcessos FinanceirosEquipes DistribuídasFerramentas E TutoriaisDesign UxPlanejamento E PrevisãoBlogAméricas

© 2023 | Todos Os Direitos Reservados

socialgekon.com