Cum să faci un crawler Web cu seleniu

Cum să faci un crawler Web cu seleniu / Programare

Traficul pe Web este extrem de util pentru a automatiza anumite sarcini efectuate în mod obișnuit pe site-uri web. Puteți scrie un crawler pentru a interacționa cu un site, la fel cum ar face un om.

Într-un articol anterioară Cum se construiește un crawler Web de bază pentru a trage informații de pe un site web Cum să construiască un crawler de bază Web pentru a trage informații de pe un site Web Ați dorit vreodată să capturați informații de pe un site web? Puteți scrie un crawler pentru a naviga pe site și pentru a extrage exact ceea ce aveți nevoie. Citiți mai multe, am acoperit elementele de bază ale scrierii unui webcrawler folosind modulul python, scrapy. Limitarea acestei abordări este aceea că crawlerul nu suportă javascript. Acesta nu va funcționa corect cu acele site-uri web care folosesc greu javascript pentru a gestiona interfața cu utilizatorul. Pentru astfel de situații, puteți scrie un crawler care utilizează Google Chrome și, prin urmare, poate gestiona javascript la fel ca un browser normal Chrome ghidat de utilizator.

Automatizarea Google Chrome implică utilizarea unui instrument numit Seleniu. Este o componentă software care se află între programul dvs. și browser și vă ajută să conduceți browserul prin intermediul programului dvs. În acest articol, vă vom trece prin întregul proces de automatizare a Google Chrome. Etapele includ în general:

  • Setarea seleniului
  • Utilizarea Inspectorului Google Chrome pentru a identifica secțiunile paginii web
  • Scrierea unui program Java pentru automatizarea Google Chrome

În scopul articolului, să investigăm cum să citiți Google Mail de pe java. Deși Google furnizează un interfață de programare pentru aplicații (API) pentru a citi e-mail, în acest articol folosim Selenium pentru a interacționa cu Google Mail pentru a demonstra procesul. Google Mail folosește în mod greșit javascriptul și, prin urmare, este un bun candidat pentru învățarea seleniului.

Setarea seleniului

Driver Web

După cum sa explicat mai sus, Selenium constă dintr-o componentă software care rulează ca un proces separat și efectuează acțiuni în numele programului java. Se numește această componentă Driver Web și trebuie să fie descărcat pe computer.

Faceți clic aici pentru a accesa site-ul de descărcare a produsului Selenium, faceți clic pe cea mai recentă versiune și descărcați fișierul corespunzător pentru sistemul dvs. de operare (Windows, Linux sau MacOS). Este o arhivă ZIP care conține chromedriver.exe. Extrageți-l într-o locație potrivită, cum ar fi C: \ WebDrivers \ chromedriver.exe. Vom folosi această locație mai târziu în programul java.

Module Java

Următorul pas este să configurați modulele java necesare pentru utilizarea seleniului. Presupunând că utilizați Maven pentru a construi programul Java, adăugați următoarea dependență la dvs. POM.xml.

   org.seleniumhq.selenium seleniu-java 3.8.1   

Când executați procesul de construire, toate modulele necesare trebuie să fie descărcate și configurate pe computer.

Seleniul Primii pași

Să începem cu Selenium. Primul pas este crearea unui ChromeDriver instanță:

Driverul WebDriver = noul ChromeDriver (); 

Ar trebui să deschideți o fereastră Google Chrome. Să navigăm la pagina de căutare Google.

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

Obțineți o referință la elementul de introducere a textului pentru a putea efectua o căutare. Elementul de introducere a textului are numele q. Găsim elemente HTML pe pagină utilizând metoda WebDriver.findElement ().

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

Puteți trimite text la orice element folosind metoda sendKeys (). Să trimitem un termen de căutare și să îl terminăm cu o linie nouă, astfel încât căutarea să înceapă imediat.

element.sendKeys ( "terminatorul \ n"); 

Acum că o căutare este în desfășurare, trebuie să așteptăm pagina de rezultate. Putem face acest lucru după cum urmează:

noul WebDriverWait (șofer, 10). până la (d -> d.getTitle () .toLowerCase () începe cu ("terminator"); 

Acest cod spune Selenium să aștepte 10 secunde și să se întoarcă atunci când începe titlul paginii terminator. Folosim o funcție lambda pentru a specifica condiția de așteptare.

Acum putem obține titlul paginii.

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

După terminarea sesiunii, fereastra browserului poate fi închisă cu:

driver.quit (); 

Și asta, oameni buni, este o sesiune de browser simplu controlată folosind java prin seleniu. Se pare destul de simplu, dar vă permite să programați o mulțime de lucruri pe care, în mod normal, ar trebui să le faceți manual.

Utilizând Inspectorul Google Chrome

Google Chrome Inspector Aflați problemele site-ului cu ajutorul instrumentelor pentru dezvoltatori Chrome sau Firebug Imaginează-ți problemele site-ului cu ajutorul instrumentelor de dezvoltare Chrome sau Firebug Dacă ați urmat tutorialele mele jQuery până acum, este posibil să fi întâlnit deja probleme de cod și nu știu cum să remediați lor. Atunci când se confruntă cu un bit non-funcțional de cod, este foarte ... Read More este un instrument de neprețuit pentru a identifica elemente care urmează să fie utilizate cu seleniu. Aceasta ne permite să direcționăm elementul exact din java pentru extragerea informațiilor, precum și o acțiune interactivă, cum ar fi clicurile pe un buton. Iată un exemplu de utilizare a Inspectorului.

Deschideți Google Chrome și navigați la o pagină, spuneți pagina IMDb pentru Liga de Justiție (2017).

Să găsim elementul care dorește să vizeze, să spunem rezumatul filmului. Faceți clic dreapta pe rezumat și selectați “Inspecta” din meniul pop-up.

De la “element” , putem vedea că textul rezumat este a div cu o clasă de summary_text.

Utilizarea CSS sau XPath pentru selecție

Seleniul acceptă selectarea elementelor din pagină utilizând CSS. (Dialectul CSS acceptat este CSS2). De exemplu, pentru a selecta textul sumar din pagina IMDb de mai sus, vom scrie:

Exemplu WebElementEl = driver.findElement (By.cssSelector ("div.summary_text")); 

De asemenea, puteți folosi XPath pentru a selecta elementele într-un mod foarte asemănător (Du-te aici pentru specificații). Din nou, pentru a selecta textul rezumat, am face:

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

XPath și CSS au capacități similare, astfel încât să puteți utiliza oricare dintre acestea vă sunt confortabile.

Citirea Google Mail din Java

Să examinăm acum un exemplu mai complex: preluarea Google Mail.

Porniți driverul Chrome, navigați la gmail.com și așteptați până când pagina este încărcată.

Driverul WebDriver = noul ChromeDriver (); driver.get ( "https://gmail.com"); noul WebDriverWait (șofer, 10) până la (d -> d.getTitle (). toLowerCase () începe cu ("gmail"); 

Apoi, căutați câmpul de e-mail (este denumit cu id-ul identifierId) și introduceți adresa de e-mail. Apasă pe Următor → și așteptați încărcarea paginii de parolă.

/ * Introduceți numele de utilizator / email * / driver.findElement (By.cssSelector ("# identifierId")). SendKeys (email); driver.findElement (By.cssSelector ( "RveJvd.")) click ().;  nou WebDriverWait (driver, 10). până la (d ->! d.findElements (By.xpath ("// div [@ id = 'parola"])); 

Acum, introduceți parola, faceți clic pe Următor → butonul din nou și așteptați încărcarea paginii Gmail.

/ * Introduceți parola * / driver .findElement (By.xpath ("// div [@ id = 'password'] // introduceți [@ type = 'parola']")) .sendKeys (password); driver.findElement (By.cssSelector ( "RveJvd.")) click ().;  nou WebDriverWait (driver, 10). până la (d ->! d.findElements (By.xpath ("// div [@ class = 'Cp']"); 

Preluați lista de rânduri de e-mail și buclă peste fiecare intrare.

Listă rws = conducătorul .findElements (By.xpath ("// div [@ class = 'Cp'] // table / tbody / tr")); pentru (WebElement tr: rows)  

Pentru fiecare intrare, preluați Din camp. Rețineți că unele intrări de la De la pot avea mai multe elemente în funcție de numărul de persoane din conversație.

/ * De la Element * / System.out.println ("From:"); pentru (WebElement e: tr.findElements (By.xpath (".// div [@ class = 'yW'] / *"))) System.out.println ("+ e.getAttribute + "," + e.getAttribute ("nume") + "," + e.getText ());  

Acum, scoateți subiectul.

/ * Subiect * / System.out.println ("Sub:" + tr.findElement (By.xpath (".// div" [) = "y6 '])).  

Și data și ora mesajului.

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

Iată numărul total de rânduri de e-mail din pagină.

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

Și în sfârșit, am terminat, așa că am părăsit browserul.

driver.quit (); 

Pentru a recupera, puteți folosi Selenium cu Google Chrome pentru a accesa cu crawlere acele site-uri care utilizează javascript puternic. Și cu Inspectorul Google Chrome este destul de ușor să creezi CSS sau XPath necesare pentru a extrage sau a interacționa cu un element.

Aveți proiecte care beneficiază de utilizarea seleniului? Și cu ce probleme te confrunți cu ea? Vă rugăm să descrieți în comentariile de mai jos.

Explorați mai multe despre: API, Dezvoltare Web.