Hoe maak je een webcrawler met selenium

Hoe maak je een webcrawler met selenium / Programming

Web Crawlen is uitermate handig 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 dat zou doen.

In een eerder artikel Een eenvoudige webcrawler bouwen om informatie van een website te trekken Hoe bouwt u een eenvoudige webcrawler om informatie van een website te trekken Wilt u ooit informatie van een website vastleggen? U kunt een crawler schrijven om door de website te navigeren en precies datgene extraheren wat u nodig heeft. Lees meer, we hebben de basisbeginselen besproken van het schrijven van een webcrawler met behulp van de python-module, scrapy. De beperking van die benadering is dat de crawler javascript niet ondersteunt. Het zal niet goed werken met die websites die veel gebruik maken van javascript om de gebruikersinterface te beheren. In dergelijke situaties kunt u een crawler schrijven die Google Chrome gebruikt en daarmee javascript behandelen, net als een normale door gebruikers aangestuurde Chrome-browser.

Het automatiseren van Google Chrome omvat het gebruik van een tool genaamd Selenium. Het is een softwarecomponent die zich tussen uw programma en de browser bevindt en waarmee u de browser door uw programma kunt leiden. In dit artikel nemen we het hele proces van het automatiseren van Google Chrome door. De stappen omvatten over het algemeen:

  • Selenium opzetten
  • Google Chrome Inspector gebruiken om secties van de webpagina te identificeren
  • Een Java-programma schrijven om Google Chrome te automatiseren

Laten we voor het doel van het artikel onderzoeken hoe Google Mail van java kan worden gelezen. Hoewel Google een API (Application Programming Interface) levert om e-mail te lezen, gebruiken we in dit artikel Selenium om met Google Mail samen te werken om het proces te demonstreren. Google Mail maakt veel gebruik van JavaScript en is dus een goede kandidaat om Selenium te leren.

Selenium instellen

Web stuurprogramma

Zoals hierboven uitgelegd, bestaat Selenium uit een softwarecomponent die als een afzonderlijk proces wordt uitgevoerd en acties uitvoert namens het Java-programma. Dit onderdeel wordt genoemd Web stuurprogramma en moet worden gedownload naar uw computer.

Klik hier om naar de Selenium-downloadsite te gaan, klik op de nieuwste release en download het juiste bestand voor uw computer-besturingssysteem (Windows, Linux of MacOS). Het is een ZIP-archief met chromedriver.exe. Pak het uit op 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 vereist 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.selenium selenium-java 3.8.1   

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

Selenium Eerste stappen

Laten we aan de slag gaan met Selenium. De eerste stap is het maken van een ChromeDriver aanleg:

WebDriver-stuurprogramma = nieuwe ChromeDriver (); 

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

driver.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 vinden 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 deze beëindigen met een nieuwe regel, zodat het zoeken onmiddellijk begint.

element.sendKeys ( "terminator \ n"); 

Nu er een zoekopdracht wordt uitgevoerd, moeten we wachten op de resultatenpagina. We kunnen dat als volgt doen:

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

Deze code vertelt Selenium in principe om 10 seconden te wachten en terug te keren wanneer de paginatitel begint terminator. We gebruiken een lambda-functie om de conditie op te geven 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 afgesloten met:

driver.quit (); 

En dat, mensen, is een eenvoudige browsersessie die wordt bestuurd met behulp van java via selenium. Lijkt heel simpel, maar stelt u in staat om een ​​heleboel dingen te programmeren die u normaal met de hand zou moeten doen.

Google Chrome Inspector gebruiken

Google Chrome Inspector Zoek uit naar problemen met de website met Chrome-ontwikkelaarstools of schiet met Firebug problemen op de website op met Chrome-ontwikkelaarstools of Firebug Als u mijn jQuery-zelfstudies tot nu toe hebt gevolgd, is het mogelijk dat u al een aantal codeproblemen tegenkomt en niet weet hoe u dit moet oplossen hen. Wanneer het geconfronteerd wordt met een niet-functioneel stukje code, is het zeer ... Lees Meer is een waardevol hulpmiddel om elementen te identificeren die met Selenium kunnen worden gebruikt. Hiermee kunnen we het exacte element van java 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 Inspecteur.

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

Laten we het element dat wil targeten vinden, zeg de samenvatting van de film. Klik met de rechtermuisknop op de samenvatting en selecteer “Inspecteren” vanuit het pop-upmenu.

Van de “Elements” tab, kunnen we zien dat de samenvattingstekst een is div met een klasse van summary_text.

CSS of XPath gebruiken voor selectie

Selenium ondersteunt het selecteren van elementen van de pagina met behulp van CSS. (CSS dialect ondersteund is CSS2). Als u bijvoorbeeld de samenvattingstekst van de IMDB-pagina hierboven wilt selecteren, schrijven we:

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

Je kunt XPath ook gebruiken om elementen op een vergelijkbare manier te selecteren (ga hier voor de specificaties). Nogmaals, om de samenvattingstekst te selecteren, doen we het volgende:

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 vanuit Java

Laten we nu een ingewikkelder voorbeeld bekijken: Google Mail ophalen.

Start het Chrome-stuurprogramma, ga naar gmail.com en wacht tot de pagina is geladen.

WebDriver-stuurprogramma = nieuwe ChromeDriver (); driver.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 het ID identifierId) en voer het e-mailadres in. Klik op de volgende en wacht tot de wachtwoordpagina is geladen.

/ * Typ gebruikersnaam / email * / driver.findElement (By.cssSelector ("# identifierId")). SendKeys (email); driver.findElement (By.cssSelector ( "RveJvd.")), klikt u op (.);  nieuwe WebDriverWait (stuurprogramma, 10) .tot (d ->! d.findElements (By.xpath ("// div [@ id = 'password']")). isEmpty ()); 

Nu voeren we het wachtwoord in, klik op de volgende opnieuw klikken en wachten tot de Gmail-pagina is geladen.

/ * Typ wachtwoord * / stuurprogramma .findElement (By.xpath ("// div [@ id = 'wachtwoord'] // invoer [@ type = 'wachtwoord']")) .sendKeys (wachtwoord); driver.findElement (By.cssSelector ( "RveJvd.")), klikt u op (.);  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.

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

Haal voor elke invoer de Van veld. Merk op dat sommige From-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 ());  

Haal nu het onderwerp op.

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

En de datum en tijd van het bericht.

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

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

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

En tot slot zijn we klaar dus hebben we de browser afgesloten.

driver.quit (); 

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

Heeft u projecten die baat hebben bij het gebruik van Selenium? En met welke problemen ga je ermee om? Beschrijf alstublieft in de opmerkingen hieronder.

Ontdek meer over: API, Web Development.