Werbung
Web-Crawling ist äußerst nützlich, um bestimmte Aufgaben zu automatisieren, die routinemäßig auf Websites ausgeführt werden. Sie können einen Crawler so schreiben, dass er wie ein Mensch mit einer Website interagiert.
In ein früherer Artikel So erstellen Sie einen einfachen Web-Crawler, um Informationen von einer Website abzurufenWollten Sie schon immer Informationen von einer Website erfassen? So schreiben Sie einen Crawler, um auf einer Website zu navigieren und das zu extrahieren, was Sie benötigen. Weiterlesen , wir haben die Grundlagen des Schreibens abgedeckt a Webcrawler Was ist Web-Scraping? So sammeln Sie Daten von WebsitesHaben Sie schon einmal erlebt, dass Sie beim Lesen von Daten auf Webseiten wertvolle Zeit verloren haben? So finden Sie die gewünschten Daten mit Web-Scraping. Weiterlesen mit dem Python-Modul, Scrapy. Die Einschränkung dieses Ansatzes besteht darin, dass der Crawler kein Javascript unterstützt. Es wird nicht richtig mit Websites funktionieren, die Javascript verwenden, um die Benutzeroberfläche zu verwalten. Für solche Situationen können Sie einen Crawler schreiben, der Google Chrome verwendet und daher Javascript wie ein normaler benutzergesteuerter Chrome-Browser verarbeiten kann.
Die Automatisierung von Google Chrome erfordert die Verwendung eines Tools namens Selen. Es ist eine Softwarekomponente, die zwischen Ihrem Programm und dem Browser sitzt und Ihnen hilft, den Browser durch Ihr Programm zu steuern. In diesem Artikel führen wir Sie durch den vollständigen Prozess der Automatisierung von Google Chrome. Die Schritte umfassen im Allgemeinen:
- Selen einrichten
- Verwenden von Google Chrome Inspector zum Identifizieren von Abschnitten der Webseite
- Ein Java-Programm schreiben, um Google Chrome zu automatisieren
Lassen Sie uns für den Zweck des Artikels untersuchen, wie Sie Google Mail aus Java lesen. Während Google eine API (Application Programming Interface) zum Lesen von E-Mails bereitstellt, verwenden wir in diesem Artikel Selenium, um mit Google Mail zu interagieren, um den Vorgang zu demonstrieren. Google Mail verwendet Javascript stark und ist daher ein guter Kandidat zum Erlernen von Selenium.
Selen einrichten
Webtreiber
Wie oben erläutert, Selen besteht aus einer Softwarekomponente, die als separater Prozess ausgeführt wird und Aktionen im Namen des Java-Programms ausführt. Diese Komponente heißt Webtreiber und muss auf Ihren Computer heruntergeladen werden.
Klicke hier Um zur Selenium-Download-Site zu gelangen, klicken Sie auf die neueste Version und laden Sie die entsprechende Datei für Ihr Computerbetriebssystem (Windows, Linux oder MacOS) herunter. Es ist ein ZIP-Archiv mit chromedriver.exe. Entpacken Sie es an einen geeigneten Ort, wie z C:\WebDrivers\chromedriver.exe. Wir werden diesen Speicherort später im Java-Programm verwenden.
Java-Module
Der nächste Schritt besteht darin, die Java-Module einzurichten, die für die Verwendung von Selenium erforderlich sind. Angenommen, Sie verwenden Maven zum Erstellen des Java-Programms, fügen Sie die folgende Abhängigkeit zu Ihrem hinzu: POM.xml.
org.seleniumhq.selenium Selen-java 3.8.1
Wenn Sie den Build-Prozess ausführen, sollten alle erforderlichen Module heruntergeladen und auf Ihrem Computer eingerichtet werden.
Selen Erste Schritte
Lassen Sie uns mit Selen beginnen. Der erste Schritt besteht darin, a. zu erstellen ChromeTreiber Beispiel:
WebDriver-Treiber = neuer ChromeDriver();
Das sollte ein Google Chrome-Fenster öffnen. Lassen Sie uns zur Google-Suchseite navigieren.
driver.get(" http://www.google.com");
Rufen Sie eine Referenz auf das Texteingabeelement ab, damit wir eine Suche durchführen können. Das Texteingabeelement hat den Namen Q. Wir lokalisieren HTML-Elemente auf der Seite mit der Methode WebDriver.findElement().
WebElement-Element = driver.findElement (By.name("q"));
Sie können mit der Methode Text an jedes Element senden sendKeys(). Lassen Sie uns einen Suchbegriff senden und mit einem Zeilenumbruch beenden, damit die Suche sofort beginnt.
element.sendKeys("Terminator\n");
Da nun eine Suche im Gange ist, müssen wir auf die Ergebnisseite warten. Das können wir wie folgt machen:
new WebDriverWait (Treiber, 10) .until (d -> d.getTitle().toLowerCase().startsWith("terminator"));
Dieser Code weist Selenium im Grunde an, 10 Sekunden zu warten und zurückzukehren, wenn der Seitentitel mit beginnt Terminator. Wir verwenden eine Lambda-Funktion, um die Bedingung anzugeben, auf die gewartet werden soll.
Jetzt können wir den Titel der Seite abrufen.
System.out.println("Titel: " + driver.getTitle());
Sobald Sie mit der Sitzung fertig sind, kann das Browserfenster geschlossen werden mit:
Treiber.quit();
Und das, Leute, ist eine einfache Browsersitzung, die mit Java über Selen gesteuert wird. Scheint recht einfach zu sein, ermöglicht Ihnen aber, viele Dinge zu programmieren, die Sie normalerweise von Hand erledigen müssten.
Verwenden von Google Chrome Inspector
Google Chrome-Inspektor Finden Sie Website-Probleme mit Chrome-Entwicklertools oder Firebug herausWenn Sie meine jQuery-Tutorials bisher verfolgt haben, sind Sie möglicherweise bereits auf einige Codeprobleme gestoßen und wissen nicht, wie Sie sie beheben können. Wenn man mit einem nicht funktionierenden Code konfrontiert wird, ist es sehr ... Weiterlesen ist ein unschätzbares Werkzeug, um Elemente zu identifizieren, die mit Selenium verwendet werden sollen. Es ermöglicht uns, das genaue Element aus Java zum Extrahieren von Informationen sowie für eine interaktive Aktion wie das Klicken auf eine Schaltfläche zu verwenden. Hier ist eine Einführung in die Verwendung des Inspektors.
Öffnen Sie Google Chrome und navigieren Sie zu einer Seite, sagen Sie die IMDb-Seite für Gerechtigkeitsliga (2017).
Lassen Sie uns das Element finden, das anvisiert werden soll, sagen wir die Filmzusammenfassung. Klicken Sie mit der rechten Maustaste auf die Zusammenfassung und wählen Sie „Inspect“ aus dem Popup-Menü.
Auf der Registerkarte „Elemente“ können wir sehen, dass der Zusammenfassungstext a. ist div mit einer klasse von Zusammenfassung_text.
CSS oder XPath für die Auswahl verwenden
Selenium unterstützt die Auswahl von Elementen auf der Seite mit CSS. (CSS-Dialekt unterstützt ist CSS2). Um beispielsweise den Zusammenfassungstext von der IMDb-Seite oben auszuwählen, würden wir schreiben:
WebElement SummaryEl = driver.findElement (By.cssSelector("div.summary_text"));
Sie können XPath auch verwenden, um Elemente auf sehr ähnliche Weise auszuwählen (Go Hier für die Spezifikationen). Um den Zusammenfassungstext auszuwählen, würden wir wieder Folgendes tun:
WebElement SummaryEl = driver.findElement (By.xpath("//div[@class='summary_text']"));
XPath und CSS haben ähnliche Funktionen, sodass Sie alles verwenden können, mit dem Sie vertraut sind.
Lesen von Google Mail aus Java
Betrachten wir nun ein komplexeres Beispiel: das Abrufen von Google Mail.
Starten Sie den Chrome-Treiber, navigieren Sie zu gmail.com und warten Sie, bis die Seite geladen ist.
WebDriver-Treiber = neuer ChromeDriver(); driver.get(" https://gmail.com"); new WebDriverWait (Treiber, 10) .until (d -> d.getTitle().toLowerCase().startsWith("gmail"));
Suchen Sie als Nächstes nach dem E-Mail-Feld (es ist mit der ID benannt BezeichnerId) und geben Sie die E-Mail-Adresse ein. Drücke den Nächste klicken und warten, bis die Passwortseite geladen ist.
/* Benutzername/E-Mail eingeben */ { driver.findElement (By.cssSelector("#identifierId")).sendKeys (E-Mail); driver.findElement (By.cssSelector(".RveJvd")).click(); } new WebDriverWait (Treiber, 10) .until (d ->! d.findElements (By.xpath("//div[@id='password']")).isEmpty() );
Jetzt geben wir das Passwort ein, klicken auf das Nächste erneut und warten Sie, bis die Gmail-Seite geladen ist.
/* Passwort eingeben */ { Treiber .findElement (By.xpath("//div[@id='password']//input[@type='password']")) .sendKeys (password); driver.findElement (By.cssSelector(".RveJvd")).click(); } new WebDriverWait (Treiber, 10) .until (d ->! d.findElements (By.xpath("//div[@class='Cp']")).isEmpty() );
Rufen Sie die Liste der E-Mail-Zeilen ab und durchlaufen Sie jeden Eintrag.
Aufführenrows = Treiber .findElements (By.xpath("//div[@class='Cp']//table/tbody/tr")); for (WebElement tr: Zeilen) { }
Rufen Sie für jeden Eintrag die Von Gebiet. Beachten Sie, dass einige Von-Einträge je nach Anzahl der Personen in der Konversation mehrere Elemente enthalten können.
{ /* Von Element */ System.out.println("Von: "); for (WebElement e: tr .findElements (By.xpath(".//div[@class='yW']/*"))) { System.out.println(" " + e.getAttribute("email") + ", " + e.getAttribute("name") + ", " + e.getText()); } }
Holen Sie nun das Thema.
{ /* Betreff */ System.out.println("Sub: " + tr.findElement (By.xpath(".//div[@class='yNN']")).getText()); }
Und das Datum und die Uhrzeit der Nachricht.
{ /* Datum/Uhrzeit */ WebElement dt = tr.findElement (By.xpath(./td[8]/*")); System.out.println("Datum: " + dt.getAttribute("Titel") + ", " + dt.getText()); }
Hier ist die Gesamtzahl der E-Mail-Zeilen auf der Seite.
System.out.println (rows.size() + "mails.");
Und schließlich sind wir fertig, also beenden wir den Browser.
Treiber.quit();
Zusammenfassend können Sie Selenium mit Google Chrome verwenden, um Websites zu crawlen, die stark Javascript verwenden. Und mit dem Google Chrome Inspector ist es ganz einfach, das erforderliche CSS oder XPath zu ermitteln, um aus einem Element zu extrahieren oder mit ihm zu interagieren.
Haben Sie Projekte, die von Selenium profitieren? Und welche Probleme haben Sie damit? Bitte in den Kommentaren unten beschreiben.