Come creare un crawler Web con selenio

Come creare un crawler Web con selenio / Programmazione

La scansione Web è estremamente utile per automatizzare determinate attività eseguite di routine sui siti Web. Puoi scrivere un crawler per interagire con un sito web proprio come farebbe un umano.

In un precedente articolo Come creare un crawler Web di base per estrarre informazioni da un sito Web Come creare un crawler Web di base per estrarre informazioni da un sito Web Avete mai desiderato acquisire informazioni da un sito Web? Puoi scrivere un crawler per navigare nel sito Web ed estrarre solo ciò di cui hai bisogno. Per saperne di più, abbiamo trattato le basi della scrittura di un webcrawler usando il modulo python, scrapy. La limitazione di tale approccio è che il crawler non supporta javascript. Non funzionerà correttamente con quei siti Web che utilizzano pesantemente javascript per gestire l'interfaccia utente. Per tali situazioni, puoi scrivere un crawler che utilizza Google Chrome e quindi può gestire javascript proprio come un normale browser Chrome basato sull'utente.

L'automazione di Google Chrome prevede l'uso di uno strumento chiamato Selenio. È un componente software che si trova tra il tuo programma e il browser e ti aiuta a guidare il browser attraverso il tuo programma. In questo articolo, ti guideremo attraverso l'intero processo di automazione di Google Chrome. I passaggi generalmente includono:

  • Impostazione del selenio
  • Utilizzando Google Chrome Inspector per identificare le sezioni della pagina web
  • Scrivere un programma java per automatizzare Google Chrome

Per lo scopo dell'articolo, esaminiamo come leggere Google Mail da java. Mentre Google fornisce un'API (Application Programming Interface) per leggere la posta, in questo articolo usiamo Selenium per interagire con Gmail per dimostrare il processo. Google Mail fa un uso pesante di javascript ed è quindi un buon candidato per l'apprendimento del selenio.

Impostazione del selenio

Driver Web

Come spiegato sopra, Selenium consiste in un componente software che viene eseguito come processo separato ed esegue azioni per conto del programma java. Questo componente è chiamato Driver Web e deve essere scaricato sul tuo computer.

Fare clic qui per accedere al sito di download di Selenium, fare clic sull'ultima versione e scaricare il file appropriato per il sistema operativo del computer (Windows, Linux o MacOS). È un archivio ZIP contenente chromedriver.exe. Estrarlo in un luogo adatto come C: \ WebDrivers \ chromedriver.exe. Utilizzeremo questa posizione più avanti nel programma java.

Moduli Java

Il passo successivo è impostare i moduli java richiesti per utilizzare Selenium. Supponendo che stai usando Maven per costruire il programma java, aggiungi la seguente dipendenza al tuo pom.xml.

   org.seleniumhq.selenium il selenio-java 3.8.1   

Quando si esegue il processo di compilazione, tutti i moduli richiesti devono essere scaricati e configurati sul computer.

Primi passi del selenio

Iniziamo con il Selenio. Il primo passo è creare un ChromeDriver esempio:

Driver WebDriver = new ChromeDriver (); 

Dovrebbe aprire una finestra di Google Chrome. Cerchiamo di navigare verso la pagina di ricerca di Google.

driver.get ( "http://www.google.com"); 

Ottieni un riferimento all'elemento di immissione del testo in modo che possiamo eseguire una ricerca. L'elemento di input del testo ha il nome q. Individuiamo elementi HTML sulla pagina usando il metodo WebDriver.findElement ().

Elemento WebElement = driver.findElement (By.name ("q")); 

Puoi inviare del testo a qualsiasi elemento usando il metodo SendKeys (). Inviamo un termine di ricerca e lo terminiamo con una nuova riga in modo che la ricerca inizi immediatamente.

element.sendKeys ( "Terminator \ n"); 

Ora che una ricerca è in corso, dobbiamo aspettare la pagina dei risultati. Possiamo farlo come segue:

nuovo WebDriverWait (driver, 10) .until (d -> d.getTitle (). toLowerCase (). startsWith ("terminator")); 

Questo codice dice fondamentalmente al selenio di attendere 10 secondi e tornare quando inizia il titolo della pagina Terminator. Usiamo una funzione lambda per specificare la condizione di attesa.

Ora possiamo ottenere il titolo della pagina.

System.out.println ("Title:" + driver.getTitle ()); 

Una volta terminata la sessione, la finestra del browser può essere chiusa con:

driver.quit (); 

E questo, gente, è una semplice sessione del browser controllata usando java tramite selenio. Sembra abbastanza semplice, ma ti permette di programmare un sacco di cose che normalmente dovresti fare a mano.

Utilizzando Google Chrome Inspector

Google Chrome Inspector illustra i problemi del sito web con gli strumenti per sviluppatori di Chrome o Firebug illustra i problemi del sito web con gli strumenti per sviluppatori di Chrome o Firebug Se hai seguito i miei tutorial su jQuery finora, potresti avere già riscontrato alcuni problemi di codice e non sapere come risolvere loro. Di fronte a un bit di codice non funzionale, è molto ... Read More è uno strumento inestimabile per identificare gli elementi da utilizzare con il selenio. Ci consente di indirizzare l'elemento esatto da java per estrarre informazioni e un'azione interattiva come fare clic su un pulsante. Ecco un manuale su come usare Inspector.

Apri Google Chrome e vai a una pagina, pronuncia la pagina IMDb di Justice League (2017).

Cerchiamo di trovare l'elemento che desideri scegliere come target, ad esempio il riepilogo del film. Fare clic con il tasto destro sul riepilogo e selezionare “Ispezionare” dal menu popup.

Dal “Elementi” scheda, possiamo vedere che il testo di sintesi è a div con una classe di summary_text.

Usando CSS o XPath per la selezione

Il selenio supporta la selezione di elementi dalla pagina tramite CSS. (Il dialetto CSS supportato è CSS2). Ad esempio per selezionare il testo di sintesi dalla pagina IMDb sopra, scriveremmo:

WebElement summaryEl = driver.findElement (By.cssSelector ("div.summary_text")); 

Puoi anche usare XPath per selezionare gli elementi in un modo molto simile (Vai qui per le specifiche). Ancora una volta, per selezionare il testo di sintesi, faremmo:

WebElement summaryEl = driver.findElement (By.xpath ("// div [@ class = 'summary_text']")); 

XPath e CSS hanno funzionalità simili, quindi puoi usare qualsiasi cosa tu stia a tuo agio.

Lettura di Google Mail da Java

Vediamo ora un esempio più complesso: il recupero di Gmail.

Avvia il Driver Chrome, vai a gmail.com e attendi fino a quando la pagina non viene caricata.

Driver WebDriver = new ChromeDriver (); driver.get ( "https://gmail.com"); nuovo WebDriverWait (driver, 10) .until (d -> d.getTitle (). toLowerCase (). startsWith ("gmail")); 

Successivamente, cerca il campo email (è denominato con l'id identifierId) e inserire l'indirizzo email. Clicca il Il prossimo pulsante e attendere che venga caricata la pagina della password.

/ * Digitare il nome utente / email * / driver.findElement (By.cssSelector ("# identificatoreId")). SendKeys (email); driver.findElement (By.cssSelector ( "RveJvd.")) fare clic su ().;  new WebDriverWait (driver, 10) .until (d ->! d.findElements (By.xpath ("// div [@ id = 'password']")). isEmpty ()); 

Ora, inseriamo la password, fare clic su Il prossimo di nuovo il pulsante e attendi che venga caricata la pagina di Gmail.

/ * Digitare la password * / driver .findElement (By.xpath ("// div [@ id = 'password'] // input [@ type = 'password']")) .sendKeys (password); driver.findElement (By.cssSelector ( "RveJvd.")) fare clic su ().;  new WebDriverWait (driver, 10) .until (d ->! d.findElements (By.xpath ("// div [@ class = 'Cp']")). isEmpty ()); 

Scarica l'elenco di righe di posta elettronica e cicla su ciascuna voce.

Elenco rows = driver .findElements (By.xpath ("// div [@ class = 'Cp'] // table / tbody / tr")); for (WebElement tr: rows)  

Per ogni voce, prendi il A partire dal campo. Si noti che alcune voci Da potrebbero avere più elementi a seconda del numero di persone nella conversazione.

/ * Da Element * / System.out.println ("From:"); for (WebElement e: tr .findElements (By.xpath (".// div [@ class = 'yW'] / *"))) System.out.println ("" + e.getAttribute ("email") + "," + e.getAttribute ("nome") + "," + e.getText ());  

Ora, prendi il soggetto.

/ * Oggetto * / System.out.println ("Sub:" + tr.findElement (By.xpath (".// div [@ class = 'y6']")). GetText ());  

E la data e l'ora del messaggio.

/ * Data / Ora * / WebElement dt = tr.findElement (By.xpath ("./ td [8] / *")); System.out.println ("Date:" + dt.getAttribute ("title") + "," + dt.getText ());  

Ecco il numero totale di righe email nella pagina.

System.out.println (rows.size () + "mails"); 

E infine, abbiamo finito così abbiamo lasciato il browser.

driver.quit (); 

Per ricapitolare, puoi utilizzare Selenium con Google Chrome per eseguire la scansione di quei siti Web che utilizzano javascript pesantemente. E con Google Chrome Inspector, è abbastanza facile elaborare il CSS o XPath richiesto per estrarre o interagire con un elemento.

Avete progetti che traggono beneficio dall'uso del selenio? E quali problemi stai affrontando? Si prega di descrivere nei commenti qui sotto.

Scopri di più su: API, Sviluppo Web.