Advertentie

Webcrawling is uiterst nuttig om bepaalde taken die routinematig op websites worden uitgevoerd, te automatiseren. U kunt een crawler schrijven om met een website te communiceren, net zoals een mens zou doen.

In een eerder artikel Een eenvoudige webcrawler bouwen om informatie van een website te halenAltijd al informatie van een website willen vastleggen? Hier leest u hoe u een crawler schrijft om door een website te navigeren en eruit te halen wat u nodig hebt. Lees verder , we hebben de basisprincipes van het schrijven van een webcrawler Wat is webscraping? Gegevens van websites verzamelenHeb je ooit gemerkt dat je kostbare tijd verliest met het lezen van gegevens op webpagina's? Hier leest u hoe u de gewenste gegevens kunt vinden met webscraping. Lees verder met behulp van de python-module, scrapy. De beperking van die aanpak is dat de crawler geen javascript ondersteunt. Het zal niet goed werken met die websites die intensief gebruik maken van javascript om de gebruikersinterface te beheren. Voor dergelijke situaties kunt u een crawler schrijven die Google Chrome gebruikt en dus javascript kan verwerken, net als een normale gebruikersgestuurde Chrome-browser.

instagram viewer

Het automatiseren van Google Chrome omvat het gebruik van een tool genaamd Selenium. Het is een softwarecomponent die tussen uw programma en de browser zit en u helpt de browser door uw programma te leiden. In dit artikel nemen we u mee door het volledige proces van het automatiseren van Google Chrome. De stappen omvatten over het algemeen:

  • Selenium instellen
  • Google Chrome Inspector gebruiken om delen van de webpagina te identificeren
  • Een java-programma schrijven om Google Chrome te automatiseren

Laten we voor het doel van het artikel onderzoeken hoe we Google Mail uit Java kunnen lezen. Hoewel Google een API (Application Programming Interface) biedt om e-mail te lezen, gebruiken we in dit artikel Selenium om te communiceren met Google Mail om het proces te demonstreren. Google Mail maakt veel gebruik van javascript en is dus een goede kandidaat om Selenium te leren.

Selenium instellen

Webstuurprogramma

Zoals hierboven uitgelegd, Selenium bestaat uit een softwarecomponent die als een apart proces draait en acties uitvoert namens het java-programma. Dit onderdeel heet Webstuurprogramma en moet naar uw computer worden gedownload.

Klik hier om naar de Selenium-downloadsite te gaan, klikt u op de nieuwste release en downloadt u het juiste bestand voor uw computerbesturingssysteem (Windows, Linux of MacOS). Het is een ZIP-archief met: chromedriver.exe. Pak het uit naar een geschikte locatie zoals: C:\WebDrivers\chromedriver.exe. We zullen deze locatie later in het Java-programma gebruiken.

Java-modules

De volgende stap is het instellen van de Java-modules die nodig zijn om Selenium te gebruiken. Ervan uitgaande dat u Maven gebruikt om het Java-programma te bouwen, voegt u de volgende afhankelijkheid toe aan uw: POM.xml.

org.seleniumhq.seleniumselenium-java3.8.1

Wanneer u het bouwproces uitvoert, moeten alle vereiste modules worden gedownload en op uw computer worden ingesteld.

Selenium eerste stappen

Laten we beginnen met Selenium. De eerste stap is het maken van een Chrome-stuurprogramma voorbeeld:

WebDriver-stuurprogramma = nieuwe ChromeDriver(); 

Dat zou een Google Chrome-venster moeten openen. Laten we naar de zoekpagina van Google navigeren.

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

Zorg voor een verwijzing naar het tekstinvoerelement zodat we een zoekopdracht kunnen uitvoeren. Het tekstinvoerelement heeft de naam Q. We lokaliseren HTML-elementen op de pagina met behulp van de methode WebDriver.findElement().

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

U kunt tekst naar elk element verzenden met behulp van de methode sendKeys(). Laten we een zoekterm verzenden en eindigen met een nieuwe regel, zodat de zoekopdracht onmiddellijk begint.

element.sendKeys("terminator\n"); 

Nu er een zoekopdracht aan de gang is, moeten we wachten op de resultatenpagina. Dat kunnen we als volgt doen:

nieuwe WebDriverWait (stuurprogramma, 10) .tot (d -> d.getTitle().toLowerCase().startsWith("terminator")); 

Deze code vertelt Selenium in feite om 10 seconden te wachten en terug te keren wanneer de paginatitel begint met terminator. We gebruiken een lambda-functie om de voorwaarde te specificeren waarop moet worden gewacht.

Nu kunnen we de titel van de pagina krijgen.

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

Als u klaar bent met de sessie, kan het browservenster worden gesloten met:

bestuurder.stop(); 

En dat, mensen, is een eenvoudige browsersessie die wordt bestuurd met behulp van java via selenium. Lijkt vrij eenvoudig, maar stelt je in staat om veel dingen te programmeren die je normaal met de hand zou moeten doen.

Google Chrome Inspector gebruiken

Google Chrome-inspecteur Zoek websiteproblemen op met Chrome Developer Tools of FirebugAls je mijn jQuery-tutorials tot nu toe hebt gevolgd, ben je misschien al een aantal codeproblemen tegengekomen en weet je niet hoe je ze kunt oplossen. Wanneer je wordt geconfronteerd met een niet-functioneel stukje code, is het erg... Lees verder is een hulpmiddel van onschatbare waarde om elementen te identificeren die met Selenium moeten worden gebruikt. Het stelt ons in staat om het exacte element uit Java te targeten voor het extraheren van informatie, evenals een interactieve actie zoals het klikken op een knop. Hier is een inleiding over het gebruik van de Inspector.

Open Google Chrome en navigeer naar een pagina, bijvoorbeeld de IMDb-pagina voor Justice League (2017).

Laten we het element vinden waarop we ons willen richten, bijvoorbeeld de filmsamenvatting. Klik met de rechtermuisknop op de samenvatting en selecteer "Inspecteren" in het pop-upmenu.

hoe maak je een webcrawler met selenium

Op het tabblad "Elementen" kunnen we zien dat de samenvattingstekst a div met een klas van samenvatting_tekst.

hoe maak je een webcrawler met selenium

CSS of XPath gebruiken voor selectie

Selenium ondersteunt het selecteren van elementen van de pagina met behulp van CSS. (Ondersteund CSS-dialect is CSS2). Om bijvoorbeeld de samenvattende tekst van de IMDb-pagina hierboven te selecteren, zouden we schrijven:

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

Je kunt XPath ook gebruiken om elementen op een vergelijkbare manier te selecteren (Go hier voor de specificaties). Nogmaals, om de samenvattende tekst te selecteren, doen we:

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

XPath en CSS hebben vergelijkbare mogelijkheden, zodat u kunt gebruiken waar u zich prettig bij voelt.

Google Mail lezen vanaf Java

Laten we nu een complexer voorbeeld bekijken: het ophalen van Google Mail.

Start de Chrome Driver, navigeer naar gmail.com en wacht tot de pagina is geladen.

WebDriver-stuurprogramma = nieuwe ChromeDriver(); stuurprogramma.get(" https://gmail.com"); nieuwe WebDriverWait (stuurprogramma, 10) .tot (d -> d.getTitle().toLowerCase().startsWith("gmail")); 

Zoek vervolgens naar het e-mailveld (het wordt genoemd met de id identifierId) en voer het e-mailadres in. Klik op de Volgende en wacht tot de wachtwoordpagina is geladen.

/* Typ gebruikersnaam/e-mail */ { driver.findElement (By.cssSelector("#identifierId")).sendKeys (e-mail); driver.findElement (By.cssSelector(".RveJvd")).klik(); } nieuwe WebDriverWait (stuurprogramma, 10) .tot (d ->! d.findElements (By.xpath("//div[@id='wachtwoord']")).isEmpty() );

Nu voeren we het wachtwoord in, klik op de Volgende knop opnieuw en wacht tot de Gmail-pagina is geladen.

/* Typ wachtwoord */ { driver .findElement (By.xpath("//div[@id='password']//input[@type='password']")) .sendKeys (wachtwoord); driver.findElement (By.cssSelector(".RveJvd")).klik(); } nieuwe WebDriverWait (stuurprogramma, 10) .tot (d ->! d.findElements (By.xpath("//div[@class='Cp']")).isEmpty() );

Haal de lijst met e-mailrijen op en loop over elk item heen.

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

Haal voor elk item de Van veld. Houd er rekening mee dat sommige Van-items meerdere elementen kunnen hebben, afhankelijk van het aantal mensen in het gesprek.

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

Nu, haal het onderwerp.

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

En de datum en tijd van het bericht.

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

Hier is het totale aantal e-mailrijen op de pagina.

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

En ten slotte zijn we klaar, dus we sluiten de browser af.

bestuurder.stop(); 

Om het samen te vatten, kunt u Selenium gebruiken met Google Chrome voor het crawlen van die websites die veel javascript gebruiken. En met de Google Chrome Inspector is het vrij eenvoudig om de vereiste CSS of XPath uit te werken om uit een element te extraheren of ermee te werken.

Heeft u projecten die baat hebben bij het gebruik van Selenium? En tegen welke problemen loop je aan? Beschrijf alstublieft in de opmerkingen hieronder.