In der letzten Folge haben wir über die Notwendigkeit gesprochen, Java zum Erstellen eines Zhihu-Crawlers zu verwenden. Dieses Mal werden wir untersuchen, wie Code verwendet wird, um den Inhalt der Webseite abzurufen.
Wenn Sie keine Erfahrung mit HTML, CSS, JS und AJAX haben, wird zunächst empfohlen, zum W3C zu gehen (klicken Sie auf mich, klicken Sie auf mich), um ein wenig zu lernen.
Apropos HTML: Dies beinhaltet ein Problem des GET-Zugriffs und des POST-Zugriffs.
Wenn Sie diesen Aspekt nicht verstehen, können Sie diesen Artikel vom W3C lesen: „GET vs. POST“.
Aha, ich werde hier nicht auf Details eingehen.
Als nächstes müssen wir Java verwenden, um den Inhalt einer Webseite zu crawlen.
Zu diesem Zeitpunkt wird sich unser Baidu als nützlich erweisen.
Genau, er ist nicht länger der unbekannte Internet-Geschwindigkeitstester, er wird bald unser Reptilien-Versuchskaninchen! ~
Werfen wir zunächst einen Blick auf die Homepage von Baidu:
Ich glaube, jeder weiß, dass eine Seite wie diese das Ergebnis der gemeinsamen Arbeit von HTML und CSS ist.
Wir klicken mit der rechten Maustaste auf die Seite im Browser und wählen „Seitenquellcode anzeigen“:
Stimmt, es ist ungefähr so. Dies ist der Quellcode der Baidu-Seite.
Unsere nächste Aufgabe besteht darin, unseren Crawler zu verwenden, um dasselbe zu erhalten.
Schauen wir uns zunächst einen einfachen Quellcode an:
java.io.* importieren;
java.net importieren.*;
öffentliche Klasse Main {
public static void main(String[] args) {
// Definieren Sie den Link, der besucht werden soll
String url = „http://www.baidu.com“;
//Definieren Sie eine Zeichenfolge zum Speichern von Webseiteninhalten
String result = "";
//Definieren Sie einen gepufferten Zeicheneingabestream
BufferedReader in = null;
versuchen {
//String in URL-Objekt konvertieren
URL realUrl = neue URL(url);
// Initialisieren Sie einen Link zu dieser URL
URLConnection-Verbindung = realUrl.openConnection();
// Die eigentliche Verbindung starten
Verbindung.connect();
// Initialisieren Sie den BufferedReader-Eingabestream, um die Antwort der URL zu lesen
in = new BufferedReader(new InputStreamReader(
Connection.getInputStream()));
// Wird verwendet, um die Daten jeder erfassten Zeile vorübergehend zu speichern
String-Linie;
while ((line = in.readLine()) != null) {
//Jede erfasste Zeile durchlaufen und im Ergebnis speichern
Ergebnis += Zeile;
}
} Catch (Ausnahme e) {
System.out.println("Beim Senden einer GET-Anfrage ist eine Ausnahme aufgetreten!" + e);
e.printStackTrace();
}
// Mit „final“ den Eingabestream schließen
Endlich {
versuchen {
if (in != null) {
in.close();
}
} Catch (Ausnahme e2) {
e2.printStackTrace();
}
}
System.out.println(result);
}
}
Das Obige ist Javas Simulation des Zugriffs von Get auf die Main-Methode von Baidu.
Sie können es ausführen, um die Ergebnisse anzuzeigen:
Aha, es ist genau das Gleiche, was wir zuvor im Browser gesehen haben. An diesem Punkt ist der einfachste Crawler fertig.
Aber ein so großer Stapel an Dingen entspricht möglicherweise nicht allen meinen Wünschen.
Nehmen Sie als Beispiel das große Pfotenlogo von Baidu.
Vorübergehender Bedarf:
Holen Sie sich den Bildlink der großen Pfote des Baidu-Logos.
Lassen Sie uns zunächst über die Browser-Anzeigemethode sprechen.
Klicken Sie mit der rechten Maustaste auf das Bild und wählen Sie „Elemente prüfen“ (Firefox, Google und IE11 verfügen alle über diese Funktion, aber die Namen sind unterschiedlich):
Aha, Sie können das schlechte IMG-Tag sehen, das von vielen Divs umgeben ist.
Diese Quelle ist der Link zum Bild.
Wie machen wir das also in Java?
Bitte beachten Sie im Voraus, dass zur Erleichterung der Code-Demonstration nicht alle Codes in Klassen gekapselt sind. Bitte haben Sie Verständnis.
Kapseln wir zunächst den vorherigen Code in eine sendGet-Funktion:
java.io.* importieren;
java.net importieren.*;
öffentliche Klasse Main {
statischer String sendGet(String url) {
//Definieren Sie eine Zeichenfolge zum Speichern von Webseiteninhalten
String result = "";
//Definieren Sie einen gepufferten Zeicheneingabestream
BufferedReader in = null;
versuchen {
//String in URL-Objekt konvertieren
URL realUrl = neue URL(url);
// Initialisiere einen Link zu dieser URL
URLConnection-Verbindung = realUrl.openConnection();
// Die eigentliche Verbindung starten
Verbindung.connect();
// Initialisieren Sie den BufferedReader-Eingabestream, um die Antwort der URL zu lesen
in = new BufferedReader(new InputStreamReader(
Connection.getInputStream()));
// Wird verwendet, um die Daten jeder erfassten Zeile vorübergehend zu speichern
String-Linie;
while ((line = in.readLine()) != null) {
// Jede erfasste Zeile durchlaufen und im Ergebnis speichern
Ergebnis += Zeile;
}
} Catch (Ausnahme e) {
System.out.println("Beim Senden einer GET-Anfrage ist eine Ausnahme aufgetreten!" + e);
e.printStackTrace();
}
// Mit „final“ den Eingabestream schließen
Endlich {
versuchen {
if (in != null) {
in.close();
}
} Catch (Ausnahme e2) {
e2.printStackTrace();
}
}
Ergebnis zurückgeben;
}
public static void main(String[] args) {
// Definieren Sie den Link, der besucht werden soll
String url = „http://www.baidu.com“;
//Greifen Sie auf den Link zu und rufen Sie den Seiteninhalt ab
String result = sendGet(url);
System.out.println(result);
}
}
Das sieht etwas aufgeräumter aus, bitte entschuldigen Sie meine Zwangsstörung.
Die nächste Aufgabe besteht darin, aus vielen erhaltenen Dingen den Link zum Bild zu finden.
Die erste Methode, die wir uns vorstellen können, besteht darin, die Funktion indexof zu verwenden, um im String-Ergebnis des Seitenquellcodes nach String-Teilstrings zu suchen.
Ja, diese Methode kann dieses Problem langsam lösen, z. B. direkt indexOf("src"), um die Startseriennummer zu finden und dann schnell die Endseriennummer abzurufen.
Allerdings können wir diese Methode nicht immer anwenden, schließlich sind Strohsandalen nur zum Herumlaufen geeignet. Später müssen wir die Beinprothesen abschneiden, um die Köpfe zu halten.
Bitte verzeihen Sie mein Eindringen und fahren Sie fort.
Wie finden wir also die Quelle dieses Bildes?
Das ist richtig, wie das Publikum unten sagte, regelmäßiges Matching.
Wenn Schüler sich bei regulären Ausdrücken nicht sicher sind, können Sie diesen Artikel lesen: [Python] Web Crawler (7): Tutorial zu regulären Ausdrücken in Python.
Einfach ausgedrückt ist Regex wie ein Matching.
Hier stehen zum Beispiel drei dicke Männer, die rote Kleidung, blaue Kleidung und grüne Kleidung tragen.
Die Regel lautet: Fang den in Grün!
Dann erwischte er den dicken grünen Mann allein.
So einfach ist das.
Allerdings ist die reguläre Grammatik immer noch umfangreich und tiefgreifend, und es ist unvermeidlich, dass Sie beim ersten Kontakt damit etwas verwirrt sind.
Ich empfehle jedem ein reguläres Online-Testtool: Online-Tests für reguläre Ausdrücke.
Wie nutzt man Regelmäßigkeit in Java, wenn Regelmäßigkeit eine magische Waffe ist?
Schauen wir uns zunächst eine einfache kleine Pflaume an.
Ah, falsch, kleine Kastanie.
// Definieren Sie eine Stilvorlage mit regulären Ausdrücken. Der zu erfassende Inhalt steht in Klammern
// Es ist gleichbedeutend mit dem Vergraben einer Falle und sie wird fallen, wenn sie übereinstimmt.
Mustermuster = Pattern.compile("href=/"(.+?)/"");
// Definiere einen Matcher für den Abgleich
Matcher matcher = pattern.matcher("<a href=/"index.html/">Meine Homepage</a>");
// wenn gefunden
if (matcher.find()) {
// Ergebnis ausdrucken
System.out.println(matcher.group(1));
}
Laufergebnisse:
index.html
Ja, das ist unser erster regulärer Code.
Der Link zum Aufnehmen von Bildern in dieser Anwendung muss immer zur Hand sein.
Wir kapseln den regulären Abgleich in eine Funktion und ändern dann den Code wie folgt:
java.io.* importieren;
java.net importieren.*;
import java.util.regex.*;
öffentliche Klasse Main {
statischer String SendGet(String url) {
//Definieren Sie eine Zeichenfolge zum Speichern von Webseiteninhalten
String result = "";
//Definieren Sie einen gepufferten Zeicheneingabestream
BufferedReader in = null;
versuchen {
//String in URL-Objekt konvertieren
URL realUrl = neue URL(url);
// Initialisiere einen Link zu dieser URL
URLConnection-Verbindung = realUrl.openConnection();
// Die eigentliche Verbindung starten
Verbindung.connect();
// Initialisieren Sie den BufferedReader-Eingabestream, um die Antwort der URL zu lesen
in = new BufferedReader(new InputStreamReader(
Connection.getInputStream()));
// Wird verwendet, um die Daten jeder erfassten Zeile vorübergehend zu speichern
String-Linie;
while ((line = in.readLine()) != null) {
// Jede erfasste Zeile durchlaufen und im Ergebnis speichern
Ergebnis += Zeile;
}
} Catch (Ausnahme e) {
System.out.println("Ausnahme beim Senden einer GET-Anfrage aufgetreten!" + e);
e.printStackTrace();
}
// Mit „final“ den Eingabestream schließen
Endlich {
versuchen {
if (in != null) {
in.close();
}
} Catch (Ausnahme e2) {
e2.printStackTrace();
}
}
Ergebnis zurückgeben;
}
static String RegexString(String targetStr, String patternStr) {
// Definieren Sie eine Stilvorlage mit regulären Ausdrücken. Der zu erfassende Inhalt steht in Klammern
// Es ist gleichbedeutend mit dem Vergraben einer Falle und sie wird fallen, wenn sie übereinstimmt.
Mustermuster = Pattern.compile(patternStr);
// Definiere einen Matcher für den Abgleich
Matcher matcher = pattern.matcher(targetStr);
// wenn gefunden
if (matcher.find()) {
// Ergebnis ausdrucken
return matcher.group(1);
}
zurückkehren "";
}
public static void main(String[] args) {
// Definieren Sie den Link, der besucht werden soll
String url = „http://www.baidu.com“;
//Greifen Sie auf den Link zu und rufen Sie den Seiteninhalt ab
String result = SendGet(url);
// Verwenden Sie reguläre Ausdrücke, um den Quellinhalt des Bildes abzugleichen
String imgSrc = RegexString(result, „Kommende reguläre Grammatik“);
// Ergebnisse drucken
System.out.println(imgSrc);
}
}
Okay, jetzt ist alles fertig, nur noch eine normale Grammatik!
Welche reguläre Aussage ist also angemessener?
Wir haben festgestellt, dass wir den gesamten Quelllink abrufen können, solange wir die Zeichenfolge src="xxxxxx" abrufen.
Also eine einfache reguläre Anweisung: src=/"(.+?)/"
Der vollständige Code lautet wie folgt:
java.io.* importieren;
java.net importieren.*;
import java.util.regex.*;
öffentliche Klasse Main {
statischer String SendGet(String url) {
//Definieren Sie eine Zeichenfolge zum Speichern von Webseiteninhalten
String result = "";
//Definieren Sie einen gepufferten Zeicheneingabestream
BufferedReader in = null;
versuchen {
//String in URL-Objekt konvertieren
URL realUrl = neue URL(url);
// Initialisiere einen Link zu dieser URL
URLConnection-Verbindung = realUrl.openConnection();
// Die eigentliche Verbindung starten
Verbindung.connect();
// Initialisieren Sie den BufferedReader-Eingabestream, um die Antwort der URL zu lesen
in = new BufferedReader(new InputStreamReader(
Connection.getInputStream()));
// Wird verwendet, um die Daten jeder erfassten Zeile vorübergehend zu speichern
String-Linie;
while ((line = in.readLine()) != null) {
// Jede erfasste Zeile durchlaufen und im Ergebnis speichern
Ergebnis += Zeile;
}
} Catch (Ausnahme e) {
System.out.println("Ausnahme beim Senden einer GET-Anfrage aufgetreten!" + e);
e.printStackTrace();
}
// Mit „final“ den Eingabestream schließen
Endlich {
versuchen {
if (in != null) {
in.close();
}
} Catch (Ausnahme e2) {
e2.printStackTrace();
}
}
Ergebnis zurückgeben;
}
static String RegexString(String targetStr, String patternStr) {
// Definieren Sie eine Stilvorlage mit regulären Ausdrücken. Der zu erfassende Inhalt steht in Klammern
// Es ist gleichbedeutend mit dem Vergraben einer Falle und sie wird fallen, wenn sie übereinstimmt.
Mustermuster = Pattern.compile(patternStr);
// Definiere einen Matcher für den Abgleich
Matcher matcher = pattern.matcher(targetStr);
// wenn gefunden
if (matcher.find()) {
// Ergebnis ausdrucken
return matcher.group(1);
}
return „Nichts“;
}
public static void main(String[] args) {
// Definieren Sie den Link, der besucht werden soll
String url = „http://www.baidu.com“;
//Greifen Sie auf den Link zu und rufen Sie den Seiteninhalt ab
String result = SendGet(url);
// Verwenden Sie reguläre Ausdrücke, um den Quellinhalt des Bildes abzugleichen
String imgSrc = RegexString(result, "src=/"(.+?)/"");
// Ergebnisse drucken
System.out.println(imgSrc);
}
}
Auf diese Weise können wir Java verwenden, um den Link zum Baidu-LOGO abzurufen.
Nun, obwohl ich viel Zeit damit verbracht habe, über Baidu zu sprechen, muss der Grundstein gelegt werden. Das nächste Mal werden wir uns offiziell auf Zhihu konzentrieren! ~