Hvordan lage en Web Crawler Med Selen
Web Crawling er ekstremt nyttig for å automatisere bestemte oppgaver som utføres rutinemessig på nettsteder. Du kan skrive en crawler for å samhandle med et nettsted, akkurat som et menneske ville gjøre.
I en tidligere artikkel Hvordan bygge en grunnleggende webkrypter for å trekke informasjon fra et nettsted Hvordan bygge en grunnleggende webkrypter for å trekke informasjon fra et nettsted Har du noen gang ønsket å fange informasjon fra et nettsted? Du kan skrive en crawler for å navigere på nettstedet og trekke ut akkurat det du trenger. Les mer, vi dekket grunnleggende om å skrive en webcrawler ved hjelp av python-modulen, scrapy. Begrensningen av denne tilnærmingen er at robotsøkeprogrammet ikke støtter javascript. Det fungerer ikke riktig med de nettstedene som gjør stor bruk av javascript for å administrere brukergrensesnittet. For slike situasjoner kan du skrive en crawler som bruker Google Chrome og dermed kan håndtere javascript, akkurat som en vanlig brukerdrevet Chrome-nettleser.
Automatisering av Google Chrome innebærer bruk av et verktøy som kalles selen. Det er en programvarekomponent som sitter mellom programmet og nettleseren, og hjelper deg med å kjøre nettleseren gjennom programmet. I denne artikkelen tar vi deg gjennom hele prosessen med å automatisere Google Chrome. Trinnene inkluderer generelt:
- Sette opp Selen
- Bruk Google Chrome Inspector til å identifisere deler av nettsiden
- Skriver et java-program for å automatisere Google Chrome
For formålet med artikkelen, la oss undersøke hvordan du leser Google Mail fra java. Selv om Google gir et API (Application Programming Interface) for å lese e-post, bruker vi i denne artikkelen Selen til å kommunisere med Google Mail for å demonstrere prosessen. Google Mail bruker tungt bruk av javascript, og er dermed en god kandidat til å lære Selen.
Sette opp Selen
Webdriver
Som beskrevet ovenfor består Selen av en programvarekomponent som kjører som en egen prosess og utfører handlinger på vegne av java-programmet. Denne komponenten kalles Webdriver og må lastes ned på datamaskinen din.
Klikk her for å gå til nedlastingsstedet for Selen, klikk på den nyeste utgivelsen og last ned den aktuelle filen for datamaskinens OS (Windows, Linux eller MacOS). Det er et ZIP-arkiv som inneholder chromedriver.exe. Trekk den ut på et passende sted, for eksempel C: \ WebDrivers \ chromedriver.exe. Vi vil bruke denne plasseringen senere i java-programmet.
Java-moduler
Neste trinn er å sette opp de Java-modulene som kreves for å bruke Selen. Forutsatt at du bruker Maven til å bygge Java-programmet, legg til følgende avhengighet til din pom.xml.
org.seleniumhq.selenium selen-java 3.8.1
Når du kjører byggeprosessen, skal alle nødvendige moduler lastes ned og settes opp på datamaskinen.
Selen første trinn
La oss komme i gang med Selen. Det første trinnet er å lage en ChromeDriver forekomst:
WebDriver driver = ny ChromeDriver ();
Det skal åpne et Google Chrome-vindu. La oss navigere til Googles søkeside.
driver.get ( "http://www.google.com");
Hent en referanse til tekstinngangselementet slik at vi kan utføre et søk. Tekstinngangselementet har navnet q. Vi finner HTML-elementer på siden ved hjelp av metoden WebDriver.findElement ().
WebElement element = driver.findElement (By.name ("q"));
Du kan sende tekst til ethvert element ved hjelp av metoden SendKeys (). La oss sende et søkeord og avslutte det med en ny linje slik at søket begynner umiddelbart.
element.sendKeys ( "terminator \ n");
Nå som et søk pågår, må vi vente på resultatsiden. Det kan vi gjøre som følger:
ny WebDriverWait (driver, 10) .until (d -> d.getTitle (). toLowerCase (). starter med ("terminator"));
Denne koden forteller i utgangspunktet Selen å vente i 10 sekunder og returnere når sidetittelen begynner med terminator. Vi bruker en lambda-funksjon for å spesifisere tilstanden til å vente på.
Nå kan vi få tittelen på siden.
System.out.println ("Tittel:" + driver.getTitle ());
Når du er ferdig med sesjonen, kan nettleservinduet lukkes med:
driver.quit ();
Og det, folkens, er en enkel nettlesersesjon kontrollert ved hjelp av java via selen. Synes ganske enkelt, men lar deg programmere mange ting som du normalt må gjøre for hånden.
Bruke Google Chrome Inspector
Google Chrome Inspector Finn ut nettsideproblemer med Chrome Developer Tools eller Firebug Finn ut nettsideproblemer med Chrome Developer Tools eller Firebug Hvis du har fulgt mine jQuery opplæringsprogrammer så langt, kan det hende du allerede har kjørt inn noen kodeproblemer og ikke vet hvordan du kan fikse dem. Når det står overfor en ikke-funksjonell bit av kode, er det veldig ... Les mer er et uvurderlig verktøy for å identifisere elementer som skal brukes med Selen. Det lar oss målrette mot det eksakte elementet fra java for å utvinne informasjon, samt en interaktiv handling som å klikke på en knapp. Her er en primer på hvordan du bruker inspektøren.
Åpne Google Chrome og naviger til en side, si IMDb-siden for Justice League (2017).
La oss finne elementet som vil målrette, si filmoversikten. Høyreklikk på oppsummeringen og velg “Undersøke” fra popup-menyen.
Fra “Elements” fanen, kan vi se at oppsummeringsteksten er en div med en klasse av summary_text.
Bruke CSS eller XPath for utvelgelse
Selen støtter valg av elementer fra siden ved hjelp av CSS. (CSS dialekt støttes er CSS2). For eksempel for å velge oppsummeringsteksten fra IMDb siden ovenfor, ville vi skrive:
WebElement summaryEl = driver.findElement (By.cssSelector ("div.summary_text"));
Du kan også bruke XPath til å velge elementer på en veldig lignende måte (Gå her for spesifikasjonene). Igjen, for å velge oppsummeringsteksten, ville vi gjøre:
WebElement summaryEl = driver.findElement (By.xpath ("// div [@ class = 'summary_text']"));
XPath og CSS har lignende funksjoner, slik at du kan bruke alt du er komfortabel med.
Leser Google Mail fra Java
La oss nå se nærmere på et mer komplisert eksempel: henting av Google Mail.
Start Chrome-driveren, naviger til gmail.com og vent til siden er lastet inn.
WebDriver driver = ny ChromeDriver (); driver.get ( "https://gmail.com"); ny WebDriverWait (driver, 10) .until (d -> d.getTitle (). toLowerCase (). starter med ("gmail"));
Deretter ser du etter e-postfeltet (det er oppkalt med id identifierId) og skriv inn e-postadressen. Klikk på neste knappen og vent på passordsiden for å laste inn.
/ * Skriv inn brukernavn / e-post * / driver.findElement (By.cssSelector ("# identifierId")) sendKeys (email); driver.findElement (By.cssSelector ( "RveJvd.")) klikk (.); ny WebDriverWait (driver, 10) .until (d ->! d.findElements (By.xpath ("// div [@ id = 'passord']")) .Empty ());
Nå skriver vi inn passordet, klikker du på neste knappen igjen og vent på at Gmail-siden skal lastes inn.
/ * Skriv inn passord * / driver .findElement (By.xpath ("// div [@ id = 'passord'] // input [@ type = 'passord']")) .sendKeys (passord); driver.findElement (By.cssSelector ( "RveJvd.")) klikk (.); ny WebDriverWait (driver, 10) .until (d ->! d.findElements (By.xpath ("// div [@ class = 'Cp']")) .Empty ());
Hent listen over e-postrader og loop over hver oppføring.
Liste rader = driver .findElements (By.xpath ("// div [@ class = 'Cp'] // tabell / tbody / tr")); for (WebElement tr: rader)
For hver oppføring, hent Fra felt. Vær oppmerksom på at noen fra oppføringer kan ha flere elementer avhengig av antall personer i samtalen.
/ * Fra Element * / System.out.println ("From:"); for (WebElement e: tr .findElements (By.xpath (".// div [@ class = 'yW'] / *"))) System.out.println ("" + e.getAttribute ("email") + "," + e.getAttribute ("navn") + "," + e.getText ());
Nå henter emnet.
/ * Emne * / System.out.println ("Sub:" + tr.findElement (By.xpath (".// div [@ class = 'y6']")). GetText ());
Og dato og klokkeslett for meldingen.
/ * Dato / Tid * / WebElement dt = tr.findElement (By.xpath ("./ td [8] / *")); System.out.println ("Date:" + dt.getAttribute ("title") + "," + dt.getText ());
Her er det totale antallet e-postrader på siden.
System.out.println (rows.size () + "mails.");
Og til slutt er vi ferdige så vi slipper nettleseren.
driver.quit ();
For å samle, kan du bruke Selen med Google Chrome for å gjennomsøke de nettstedene som bruker javascript tungt. Og med Google Chrome Inspector er det ganske enkelt å trene den nødvendige CSS eller XPath for å trekke ut fra eller samhandle med et element.
Har du noen prosjekter som drar nytte av å bruke Selen? Og hvilke problemer står du overfor med det? Vennligst beskriv i kommentarene nedenfor.
Utforsk mer om: API, Webutvikling.