Annons

Webbsökning är extremt användbart för att automatisera vissa uppgifter som utförs rutinmässigt på webbplatser. Du kan skriva en sökrobot för att interagera med en webbplats precis som en människa skulle göra.

I en tidigare artikel Hur man bygger en grundläggande webbsökrobot för att hämta information från en webbplatsHar du någonsin velat fånga information från en webbplats? Så här skriver du en sökrobot för att navigera på en webbplats och extrahera det du behöver. Läs mer , vi täckte grunderna för att skriva en webcrawler Vad är webbskrapning? Hur man samlar in data från webbplatserHar du någonsin sett att du förlorat värdefull tid på att läsa data på webbsidor? Så här hittar du den data du vill ha med webbskrapning. Läs mer med pythonmodulen, scrapy. Begränsningen med det tillvägagångssättet är att sökroboten inte stöder javascript. Det kommer inte att fungera korrekt med de webbplatser som använder javascript för att hantera användargränssnittet. För sådana situationer kan du skriva en sökrobot som använder Google Chrome och därmed kan hantera javascript precis som en vanlig användardriven Chrome-webbläsare.

Att automatisera Google Chrome innebär användning av ett verktyg som heter Selen. Det är en mjukvarukomponent som sitter mellan ditt program och webbläsaren och hjälper dig att köra webbläsaren genom ditt program. I den här artikeln tar vi dig genom hela processen för att automatisera Google Chrome. Stegen inkluderar i allmänhet:

  • Konfigurera Selenium
  • Använda Google Chrome Inspector för att identifiera delar av webbsidan
  • Skriver ett java-program för att automatisera Google Chrome

För syftet med artikeln, låt oss undersöka hur man läser Google Mail från java. Även om Google tillhandahåller ett API (Application Programming Interface) för att läsa e-post, använder vi i den här artikeln Selenium för att interagera med Google Mail för att demonstrera processen. Google Mail använder sig mycket av javascript och är därför en bra kandidat för att lära sig selen.

Ställa in Selenium

Webbdrivrutin

Som förklarats ovan, Selen består av en mjukvarukomponent som körs som en separat process och utför åtgärder på uppdrag av java-programmet. Denna komponent kallas Webbdrivrutin och måste laddas ner till din dator.

Klicka här för att gå till nedladdningssidan för Selenium, klicka på den senaste versionen och ladda ner lämplig fil för din dators operativsystem (Windows, Linux eller MacOS). Det är ett ZIP-arkiv som innehåller chromedriver.exe. Extrahera den till en lämplig plats som t.ex C:\WebDrivers\chromedriver.exe. Vi kommer att använda den här platsen senare i java-programmet.

Java-moduler

Nästa steg är att ställa in de Java-moduler som krävs för att använda Selenium. Förutsatt att du använder Maven för att bygga java-programmet, lägg till följande beroende till din POM.xml.

org.seleniumhq.seleniumselen-java3.8.1

När du kör byggprocessen bör alla nödvändiga moduler laddas ner och installeras på din dator.

Selen första stegen

Låt oss komma igång med Selenium. Det första steget är att skapa en ChromeDriver exempel:

WebDriver-drivrutin = ny ChromeDriver(); 

Det bör öppna ett Google Chrome-fönster. Låt oss navigera till Googles söksida.

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

Skaffa en referens till textinmatningselementet så att vi kan utföra en sökning. Textinmatningselementet har namnet q. Vi hittar HTML-element på sidan med metoden WebDriver.findElement().

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

Du kan skicka text till vilket element som helst med metoden sendKeys(). Låt oss skicka en sökterm och avsluta den med en ny rad så börjar sökningen omedelbart.

element.sendKeys("terminator\n"); 

Nu när en sökning pågår måste vi vänta på resultatsidan. Vi kan göra det på följande sätt:

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

Den här koden säger i princip att Selenium ska vänta i 10 sekunder och återvända när sidtiteln börjar med terminator. Vi använder en lambda-funktion för att specificera villkoret att vänta på.

Nu kan vi få sidans titel.

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

När du är klar med sessionen kan webbläsarfönstret stängas med:

driver.quit(); 

Och det, gott folk, är en enkel webbläsarsession som kontrolleras med java via selen. Verkar ganska enkelt, men gör att du kan programmera många saker som du normalt skulle behöva göra för hand.

Använder Google Chrome Inspector

Google Chrome Inspector Ta reda på webbplatsproblem med Chrome Developer Tools eller FirebugOm du har följt mina jQuery-handledningar hittills, kanske du redan har stött på några kodproblem och inte vetat hur du fixar dem. När man står inför en icke-funktionell kodbit är det väldigt... Läs mer är ett ovärderligt verktyg för att identifiera element som ska användas med Selen. Det låter oss rikta in det exakta elementet från java för att extrahera information samt en interaktiv åtgärd som att klicka på en knapp. Här är en primer om hur man använder Inspector.

Öppna Google Chrome och navigera till en sida, säg IMDb-sidan för Justice League (2017).

Låt oss hitta det element som vill rikta in sig på, säg filmsammanfattningen. Högerklicka på sammanfattningen och välj "Inspektera" från popupmenyn.

hur man gör en sökrobot med selen

Från fliken "Element" kan vi se att sammanfattningstexten är en div med en klass av summary_text.

hur man gör en sökrobot med selen

Använder CSS eller XPath för urval

Selen stöder val av element från sidan med CSS. (CSS-dialekt som stöds är CSS2). Till exempel för att välja sammanfattningstexten från IMDb-sidan ovan skulle vi skriva:

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

Du kan också använda XPath för att välja element på ett mycket liknande sätt (Go här för specifikationerna). Återigen, för att välja sammanfattningstexten skulle vi göra:

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

XPath och CSS har liknande funktioner så att du kan använda vad du än är bekväm med.

Läsa Gmail från Java

Låt oss nu titta på ett mer komplext exempel: att hämta Google Mail.

Starta Chrome Driver, navigera till gmail.com och vänta tills sidan har laddats.

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

Leta sedan efter e-postfältet (det heter med id identifierId) och ange e-postadressen. Klicka på Nästa och vänta tills lösenordssidan laddas.

/* Skriv in användarnamn/e-post */ { driver.findElement (By.cssSelector("#identifierId")).sendKeys (e-post); driver.findElement (By.cssSelector(".RveJvd")).klick(); } ny WebDriverWait (drivrutin, 10) .till (d ->! d.findElements (By.xpath("//div[@id='lösenord']")).isEmpty() );

Nu anger vi lösenordet, klicka på Nästa knappen igen och vänta tills Gmail-sidan laddas.

/* Ange lösenord */ { driver .findElement (By.xpath("//div[@id='lösenord']//input[@type='lösenord']")) .sendKeys (lösenord); driver.findElement (By.cssSelector(".RveJvd")).klick(); } ny WebDriverWait (drivrutin, 10) .till (d ->! d.findElements (By.xpath("//div[@class='Cp']")).isEmpty() );

Hämta listan med e-postrader och gå över varje post.

Listarows = drivrutin .findElements (By.xpath("//div[@class='Cp']//table/tbody/tr")); för (WebElement tr: rader) { }

För varje post, hämta Från fält. Observera att vissa Från-poster kan ha flera element beroende på antalet personer i konversationen.

{ /* Från element */ System.out.println("Från: "); för (WebElement e: tr .findElements (By.xpath(".//div[@class='yW']/*")) { System.out.println(" " + e.getAttribute("email") + ", " + e.getAttribute("namn") + ", " + e.getText()); } }

Nu, hämta ämnet.

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

Och datum och tid för meddelandet.

{ /* Date/Time */ WebElement dt = tr.findElement (By.xpath("./td[8]/*")); System.out.println("Datum: " + dt.getAttribute("titel") + ", " + dt.getText()); }

Här är det totala antalet e-postrader på sidan.

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

Och äntligen är vi klara så vi avslutar webbläsaren.

driver.quit(); 

För att sammanfatta kan du använda Selenium med Google Chrome för att genomsöka de webbplatser som använder javascript mycket. Och med Google Chrome Inspector är det ganska enkelt att räkna ut den CSS eller XPath som krävs för att extrahera från eller interagera med ett element.

Har du några projekt som tjänar på att använda Selen? Och vilka problem har du med det? Vänligen beskriv i kommentarerna nedan.