Annonse

Webcrawling er ekstremt nyttig for å automatisere visse oppgaver som utføres rutinemessig på nettsteder. Du kan skrive en crawler for å samhandle med et nettsted akkurat som et menneske ville gjort.

I en tidligere artikkel Hvordan bygge en grunnleggende webcrawler for å hente informasjon fra et nettstedHar du noen gang ønsket å fange informasjon fra et nettsted? Slik skriver du en crawler for å navigere på et nettsted og trekke ut det du trenger. Les mer , dekket vi det grunnleggende om å skrive en webcrawler Hva er nettskraping? Hvordan samle inn data fra nettstederHar du noen gang mistet verdifull tid på å lese data på nettsider? Slik finner du dataene du vil ha med nettskraping. Les mer ved å bruke pythonmodulen, scrapy. Begrensningen med denne tilnærmingen er at crawleren ikke støtter javascript. Det vil ikke fungere ordentlig med de nettstedene som bruker mye 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 heter Selen. Det er en programvarekomponent som sitter mellom programmet og nettleseren, og hjelper deg å kjøre nettleseren gjennom programmet. I denne artikkelen tar vi deg gjennom hele prosessen med å automatisere Google Chrome. Trinnene inkluderer vanligvis:

  • Sette opp Selenium
  • Bruke Google Chrome Inspector for å identifisere deler av nettsiden
  • Skrive et java-program for å automatisere Google Chrome

For formålet med artikkelen, la oss undersøke hvordan du leser Google Mail fra java. Mens Google tilbyr et API (Application Programming Interface) for å lese e-post, bruker vi i denne artikkelen Selenium til å samhandle med Google Mail for å demonstrere prosessen. Google Mail bruker mye javascript, og er dermed en god kandidat for å lære Selenium.

Sette opp Selenium

Web-driver

Som forklart ovenfor, Selen består av en programvarekomponent som kjører som en egen prosess og utfører handlinger på vegne av java-programmet. Denne komponenten kalles Web-driver og må lastes ned til datamaskinen din.

Klikk her for å gå til nedlastingssiden for Selenium, klikk på den nyeste utgivelsen og last ned den riktige filen for datamaskinens operativsystem (Windows, Linux eller MacOS). Det er et ZIP-arkiv som inneholder chromedriver.exe. Trekk den ut til et passende sted som f.eks C:\WebDrivers\chromedriver.exe. Vi vil bruke denne plasseringen senere i java-programmet.

Java-moduler

Neste trinn er å sette opp java-modulene som kreves for å bruke Selenium. Forutsatt at du bruker Maven til å bygge java-programmet, legg til følgende avhengighet til din POM.xml.

org.seleniumhq.seleniumselen-java3.8.1

Når du kjører byggeprosessen, bør 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 bør åpne et Google Chrome-vindu. La oss navigere til Googles søkeside.

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

Få en referanse til tekstinndataelementet slik at vi kan utføre et søk. Tekstinndataelementet 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 et hvilket som helst element ved å bruke metoden sendKeys(). La oss sende et søkeord og avslutte det med en ny linje slik at søket starter umiddelbart.

element.sendKeys("terminator\n"); 

Nå som et søk pågår, må vi vente på resultatsiden. Vi kan gjøre det som følger:

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

Denne koden forteller i utgangspunktet at Selenium skal vente i 10 sekunder og komme tilbake når sidetittelen begynner med terminator. Vi bruker en lambda-funksjon for å spesifisere tilstanden vi skal vente på.

Nå kan vi få tittelen på siden.

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

Når du er ferdig med økten, kan nettleservinduet lukkes med:

driver.quit(); 

Og det, folkens, er en enkel nettleserøkt kontrollert ved hjelp av java via selen. Virker ganske enkelt, men lar deg programmere mange ting som du vanligvis må gjøre for hånd.

Bruker Google Chrome Inspector

Google Chrome Inspector Finn ut nettstedsproblemer med Chrome-utviklerverktøy eller FirebugHvis du har fulgt mine jQuery-veiledninger så langt, kan det hende du allerede har støtt på noen kodeproblemer og ikke visste hvordan du fikser dem. Når du står overfor en ikke-funksjonell kodebit, er det veldig... Les mer er et uvurderlig verktøy for å identifisere elementer som skal brukes med selen. Den lar oss målrette mot det eksakte elementet fra java for å trekke ut informasjon samt en interaktiv handling som å klikke på en knapp. Her er en primer om hvordan du bruker Inspector.

Åpne Google Chrome og naviger til en side, si IMDb-siden for Justice League (2017).

La oss finne elementet som ønsker å målrette, sier filmsammendraget. Høyreklikk på sammendraget og velg "Inspiser" fra hurtigmenyen.

hvordan lage en webcrawler med selen

Fra "Elementer"-fanen kan vi se at sammendragsteksten er en div med en klasse på summary_text.

hvordan lage en webcrawler med selen

Bruk av CSS eller XPath for utvelgelse

Selenium støtter valg av elementer fra siden ved hjelp av CSS. (CSS-dialekt støttes er CSS2). For å for eksempel velge sammendragsteksten fra IMDb-siden ovenfor, vil 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 (Go her for spesifikasjonene). Igjen, for å velge sammendragsteksten, 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 det du er komfortabel med.

Lese Google Mail fra Java

La oss nå se på et mer komplekst 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"); new WebDriverWait (driver, 10) .til (d -> d.getTitle().toLowerCase().startsWith("gmail")); 

Se deretter etter e-postfeltet (det er navngitt med id identifierId) og skriv inn e-postadressen. Klikk på Neste og vent til passordsiden lastes inn.

/* Skriv inn brukernavn/e-post */ { driver.findElement (By.cssSelector("#identifierId")).sendKeys (e-post); driver.findElement (By.cssSelector(".RveJvd")).klikk(); } ny WebDriverWait (driver, 10) .inntil (d ->! d.findElements (By.xpath("//div[@id='passord']")).isEmpty() );

Nå skriver vi inn passordet, klikker på Neste knappen igjen og vent til Gmail-siden 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) .inntil (d ->! d.findElements (By.xpath("//div[@class='Cp']")).isEmpty() );

Hent listen over e-postrader og sløyfe over hver oppføring.

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

For hver oppføring, hent Fra felt. Merk at noen Fra-oppføringer kan ha flere elementer avhengig av antall personer i samtalen.

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

Nå, hent emnet.

{ /* Emne */ System.out.println("Sub: " + tr.findElement (By.xpath(".//div[@class='yNN']")).getText()); }

Og dato og klokkeslett for meldingen.

{ /* Date/Time */ WebElement dt = tr.findElement (By.xpath("./td[8]/*")); System.out.println("Dato: " + dt.getAttribute("tittel") + ", " + 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 avslutter nettleseren.

driver.quit(); 

For å oppsummere, kan du bruke Selenium med Google Chrome for å gjennomsøke nettsteder som bruker javascript mye. Og med Google Chrome Inspector er det ganske enkelt å finne ut den nødvendige CSS eller XPath for å trekke ut fra eller samhandle med et element.

Har du noen prosjekter som har nytte av å bruke Selen? Og hvilke problemer har du med det? Vennligst beskriv i kommentarene nedenfor.