Raspando um site dinâmico usando Python e Selenium.

Dec 17 2022
Introdução Algum tempo atrás, recebi uma tarefa em que precisava coletar dados de um site espanhol para reservas de hotéis. Temos algumas opções quando nos deparamos com esse tipo de tarefas, Sopa bonita, Scrapy e selênio.

Introdução

Algum tempo atrás, recebi uma tarefa em que precisava coletar dados de um site espanhol para reservas de hotéis. Temos algumas opções quando nos deparamos com esse tipo de tarefas, Sopa bonita, Scrapy e selênio. A sopa bonita não funciona bem com sites dinâmicos e não prefiro a maneira como o script scrapy funciona. Ao contrário do scrapy e de outros métodos em que você começa a colocar links imediatamente, no Selenium você deve primeiro obter um Webdriver para o navegador que deseja usar para a tarefa.

Configurando o sistema para o projeto

O passo mais importante antes de iniciar qualquer projeto é ter seu sistema preparado para o projeto. Aqui estão os passos a seguir para a configuração do projeto:

  1. Python - Você pode baixar o python aqui . Certifique-se também de adicionar python ao caminho ao instalá-lo.
  2. Crie um ambiente virtual no diretório do seu projeto. Você pode criar um ambiente virtual usandopython -m venv [name you want to give to your environment].
  3. Ative seu ambiente virtual. Presumo que você esteja no diretório do projeto agora e [environment name]\Scripts\activateativará seu ambiente virtual.
  4. Agora, neste ambiente você instalará o Selenium. pip install selenium==<required version>instalará a versão necessária do Selenium. Eu usei a versão 3 para o projeto.
  5. Obtenha um driver do Chrome dependendo da versão do Chrome que você está usando. Você pode obter seu driver aqui .
Estrutura do diretório do projeto.

Os dados extraídos vão para o diretório “Data” e o driver que baixamos vai para o diretório “driver”.

Agora, dentro do diretório principal, você criará um arquivo python onde escreverá o script para extrair os dados do site.

Começaremos importando as bibliotecas necessárias:

Importar bibliotecas necessárias.

Para iniciar o script vamos primeiro criar um objeto driver utilizando selenium.webdriverda seguinte forma:

driver = webdriver.Chrome(executable_path ='data/chromedriver.exe')

O site do qual queremos recolher os dados é rentalia e pode ser encontrado neste endereço “https://es.rentalia.com/”

faremos o driver primeiro acessar o site usando o comandodriver.get('https://es.rentalia.com/')

Agora, uma vez que o driver está no site, ele pode acessar todos os elementos html presentes na página da web em que está. Você pode consultar este link para saber sobre as funções que podemos usar para acessar os elementos presentes na página da web-”https://iqss.github.io/dss-webscrape/finding-web-elements.html”.

Você deve estar familiarizado com a função de seletor de elementos no Selenium webdriver agora e o próximo passo é obter as referências dos elementos dos quais você deseja obter seus dados. Para isso, basta abrir as opções do desenvolvedor em seu navegador, basta pressionar F12ou clicar com o botão direito do mouse no elemento que deseja selecionar e você encontrará a opção de inspecionar ao clicar na qual será direcionado ao código html para ele. A partir desse código, você pode obter o nome da classe, html, id ou o caminho X, o caminho X pode ser obtido no menu exibido ao clicar no elemento html do código.

Aqui está como você obteria o X-path:

Começando pelo processo:

O primeiro e mais importante ponto é abrir o site no navegador com o qual você fará seu webdriver funcionar e começar a observar os processos.

Por exemplo, existe um botão para aceitar cookies no momento em que a página é carregada. Você só poderá interagir com o conteúdo interno se tiver clicado nesse botão.

Você pode ver o bloco na parte inferior solicitando que você concorde com os termos.

Agora, quando terminar, você terá que preencher as entradas para obter os resultados da área para a qual precisa de dados. A página de resultados teria uma lista de hotéis com informações sobre os quartos, como preço por noite, localização, uma breve descrição etc. Uma coisa que não existe nessa página é o número de contato que você pode usar para perguntar sobre o quarto. Portanto, teremos que ir à página de detalhes de cada quarto de hotel para obter o número.

Página de listagens com as informações básicas sobre os quartos.
Isso você encontrará na página de detalhes.

Dividi a formação do roteiro nas seguintes etapas:

  • Acessando o botão para aceitar os termos para acessar a página da web.
  • #clicking the accepting button 
    cookies_btn = driver.find_element('xpath', '//*[@id="didomi-host"]/div/div/div/div//div[2]/button[2]')
    cookies_btn.click()
    # we used xpath to access the element and once we get the object made for the element we can click simply by adding click() method.
    

    # inputing the locations from the given list 
    input_field.send_keys(loc)
    ActionChains(driver).send_keys(Keys.DOWN).send_keys(Keys.ENTER).perform()
    # we replicated the interaction we make to input and submit the query in the input bar using action chains
    

    Extraindo informações.

Para obter os dados de cada site, incluí um loop dentro de uma instrução de gravação para gerar uma tabela apenas com cabeçalhos em relação às variáveis ​​que temos e, à medida que o loop continua, o código preencheria as linhas com dados do espaço reservado que definimos e usamos para extração. Houve mais algumas coisas que adicionei para que funcione bem e com eficiência na coleta de dados, você pode encontrar o código finalizado aqui . Por exemplo, fiz o script para obter entradas do usuário como argumentos, você obterá todas as informações necessárias nesse repositório. Mas antes de obter o código de lá, gostaria que você implementasse isso por conta própria.

Além disso, não existe uma regra padrão para obter os dados em um arquivo csv, portanto, faça o que achar interessante.

Eu espero que isto tenha sido útil !