Scraping di un sito Web dinamico utilizzando Python e Selenium.

Dec 17 2022
Introduzione Qualche tempo fa mi è stato affidato un compito in cui avevo bisogno di raccogliere dati da un sito web spagnolo per le prenotazioni alberghiere. Abbiamo alcune opzioni quando ci imbattiamo in questo tipo di compiti, Bella zuppa, Scrapy e selenio.

introduzione

Qualche tempo fa mi è stato affidato un compito in cui avevo bisogno di raccogliere dati da un sito web spagnolo per le prenotazioni alberghiere. Abbiamo alcune opzioni quando ci imbattiamo in questo tipo di compiti, Bella zuppa, Scrapy e selenio. La bella zuppa non funziona bene con i siti Web dinamici e non preferisco il modo in cui funziona lo script scrapy. A differenza di scrapy e altri metodi in cui inizi subito a inserire collegamenti, in selenium devi prima ottenere un Webdriver per il browser che desideri utilizzare per l'attività.

Impostazione del sistema per il progetto

Il passo più importante prima di iniziare qualsiasi progetto è preparare il tuo sistema per il progetto. Ecco i passaggi da seguire per la configurazione del progetto:

  1. Python: puoi scaricare Python da qui . Assicurati inoltre di aggiungere python al percorso durante l'installazione.
  2. Crea un ambiente virtuale nella directory del tuo progetto. È possibile creare un ambiente virtuale utilizzandopython -m venv [name you want to give to your environment].
  3. Attiva il tuo ambiente virtuale. Presumo che tu sia nella directory del progetto ormai e [environment name]\Scripts\activateattiverai il tuo ambiente virtuale.
  4. Ora, in questo ambiente installerai il selenio. pip install selenium==<required version>installerà la versione richiesta di selenium. Ho usato la versione 3 per il progetto.
  5. Ottieni un driver Chrome a seconda della versione di Chrome che stai utilizzando. Puoi ottenere il tuo autista da qui .
Struttura della directory del progetto.

I dati estratti vanno nella directory "Dati" e il driver che abbiamo scaricato va nella directory "driver".

Ora, all'interno della directory principale creerai un file python in cui scriverai lo script per estrarre i dati dal sito web.

Inizieremo importando le librerie necessarie:

Importazione delle librerie necessarie.

Per avviare lo script creeremo prima un oggetto driver utilizzando selenium.webdrivernel modo seguente:

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

Il sito da cui vogliamo raccogliere i dati è rentalia e si trova a questo indirizzo “https://es.rentalia.com/"

faremo in modo che il driver acceda prima al sito Web utilizzando il comandodriver.get('https://es.rentalia.com/')

Ora, una volta che il driver è sul sito Web, può accedere a tutti gli elementi html presenti sulla pagina Web in cui si trova. Puoi fare riferimento a questo link per conoscere le funzioni che possiamo utilizzare per accedere agli elementi presenti presenti sulla pagina web-”https://iqss.github.io/dss-webscrape/finding-web-elements.html”.

Ormai dovresti avere familiarità con la funzione di selezione degli elementi nel selenium webdriver e il prossimo passo è ottenere le referenze degli elementi da cui vuoi ottenere i tuoi dati. Per questo devi solo aprire le opzioni sviluppatore nel tuo browser, puoi semplicemente premere F12o fare clic con il pulsante destro del mouse sull'elemento che desideri selezionare e troverai l'opzione per ispezionare facendo clic su cui verrai indirizzato al codice html per esso. Da quel codice puoi ottenere il nome della classe, html, id o X-path, X-path può essere ottenuto nel menu che viene visualizzato facendo clic sull'elemento code html.

Ecco come otterresti il ​​percorso X:

A partire dal processo:

Il primo e più importante punto è aprire il sito web sul browser con cui farai funzionare il tuo webdriver e iniziare a osservare i processi.

Ad esempio, è presente un pulsante per accettare i cookie nel momento in cui la pagina viene caricata. Sarai in grado di interagire con il contenuto all'interno solo se hai fatto clic su quel pulsante.

Puoi vedere il blocco in basso che ti chiede di accettare i termini.

Ora, una volta terminato, dovrai compilare gli input per ottenere i risultati per l'area per la quale hai bisogno di dati. La pagina dei risultati avrebbe un elenco di hotel con informazioni sulle camere come, prezzo per notte, posizione, una breve descrizione, ecc. Una cosa che non c'è in quella pagina è il numero di contatto che puoi usare per chiedere informazioni sulla camera. Quindi dovremo andare alla pagina dei dettagli su ogni camera d'albergo per ottenere il numero.

Pagina degli elenchi con le informazioni di base sulle camere.
Questo lo troverai nella pagina dei dettagli.

Ho suddiviso la formazione dello script nelle seguenti fasi:

  • Accedere al pulsante per accettare i termini per arrivare alla pagina 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
    

    Estrazione di informazioni.

Per ottenere i dati per ogni sito ho incluso il ciclo all'interno di un'istruzione di scrittura per generare una tabella con solo intestazioni rispetto alle variabili che abbiamo e quindi mentre il ciclo continua il codice riempie le righe con i dati dal segnaposto che abbiamo definito e utilizzato per l'estrazione. C'erano alcune altre cose che ho aggiunto per farlo funzionare bene ed efficientemente nella raccolta dei dati, puoi trovare il codice finito qui . Ad esempio, ho creato lo script per ricevere input dall'utente come argomenti, otterrai tutte le informazioni richieste in quel repository. Ma prima di ottenere il codice da lì, vorrei che lo implementassi da solo.

Inoltre, non esiste una regola standard per ottenere i dati in un file csv, quindi fai ciò che ritieni possa sembrare interessante.

Spero che questo sia stato utile!