Zhihu ist eine echte Online-Q&A-Community mit einer freundlichen, rationalen und seriösen Community-Atmosphäre, die Eliten aus allen Lebensbereichen verbindet. Sie tauschen ihr Fachwissen, ihre Erfahrungen und Erkenntnisse untereinander aus und stellen kontinuierlich hochwertige Informationen für das chinesische Internet bereit.
Nehmen Sie sich zunächst drei bis fünf Minuten Zeit, um ein Logo zu entwerfen. =Als Programmierer hatte ich schon immer ein Herz dafür, ein Künstler zu sein!
Okay, es ist ein bisschen provisorisch, also begnüge ich mich vorerst damit.
Als nächstes begannen wir mit der Herstellung von Zhihus Crawler.
Bestimmen Sie zunächst das erste Ziel: Redaktionsempfehlung.
Weblink: http://www.zhihu.com/explore/recommendations
Wir haben den letzten Code leicht geändert, um zunächst die Möglichkeit zu erreichen, den Inhalt der Seite abzurufen:
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.zhihu.com/explore/recommendations";
//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(result);
}
}
Nach der Ausführung gibt es kein Problem. Der nächste Schritt ist ein reguläres Matching-Problem.
Lassen Sie uns zunächst alle Fragen auf dieser Seite beantworten.
Klicken Sie mit der rechten Maustaste auf den Titel und überprüfen Sie das Element:
Aha, Sie können sehen, dass der Titel tatsächlich ein Tag ist, also ein Hyperlink, und das, was von anderen Hyperlinks unterschieden werden kann, sollte die Klasse sein, also der Klassenselektor.
So kommt unsere reguläre Anweisung heraus: questions_link.+?href=/"(.+?)/"
Rufen Sie die RegexString-Funktion auf und übergeben Sie ihr Parameter:
public static void main(String[] args) {
// Definieren Sie den Link, der besucht werden soll
String url = "http://www.zhihu.com/explore/recommendations";
//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, "question_link.+?>(.+?)<");
// Ergebnisse drucken
System.out.println(imgSrc);
}
Ah ha, Sie können sehen, dass wir einen Titel erfolgreich erfasst haben (Hinweis: nur einen):
Moment mal, was ist das für ein Durcheinander? !
Sei nicht nervös =. =Es sind nur verstümmelte Zeichen.
Informationen zu Codierungsproblemen finden Sie unter: HTML-Zeichensatz
Im Allgemeinen sind UTF-8-, GB2312- und GBK-Kodierungen die gängigsten Kodierungen mit besserer Unterstützung für Chinesisch.
Die Webseite kann die Webseitenkodierung über den Zeichensatz des Meta-Tags festlegen, zum Beispiel:
<meta charset="utf-8" />
Klicken wir mit der rechten Maustaste, um den Quellcode der Seite anzuzeigen:
Wie Sie sehen können, verwendet Zhihu die UTF-8-Kodierung.
Hier erkläre ich Ihnen den Unterschied zwischen dem Anzeigen des Seitenquellcodes und dem Überprüfen von Elementen.
Beim Anzeigen des Seitenquellcodes wird der gesamte Code der gesamten Seite angezeigt. Dies entspricht der direkten Anzeige des Quellcodes, z. B Meta.
Inspect-Element, oder einige Browser nennen es View-Element, um das Element anzuzeigen, auf das Sie mit der rechten Maustaste klicken, z. B. ein Div oder ein IMG. Es eignet sich besser zum Anzeigen der Attribute und Tags eines Objekts.
Okay, jetzt wissen wir, dass das Problem in der Kodierung liegt. Der nächste Schritt besteht darin, die Kodierung des erfassten Inhalts zu konvertieren.
Die Implementierung in Java ist sehr einfach. Geben Sie einfach die Codierungsmethode in InputStreamReader an:
// Initialisieren Sie den BufferedReader-Eingabestream, um die Antwort der URL zu lesen
in = new BufferedReader(new InputStreamReader(
Connection.getInputStream(),"UTF-8"));
Wenn Sie das Programm zu diesem Zeitpunkt erneut ausführen, werden Sie feststellen, dass der Titel normal angezeigt werden kann:
OK! sehr gut!
Aber jetzt gibt es nur noch einen Titel, wir brauchen alle Titel.
Wir modifizieren den regulären Ausdruck leicht und speichern die Suchergebnisse in einer ArrayList:
java.io.* importieren;
java.net importieren.*;
import java.util.ArrayList;
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(), „UTF-8“));
// 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 ArrayList<String> RegexString(String targetStr, String patternStr) {
// Definieren Sie eine ArrayList vor, um die Ergebnisse zu speichern
ArrayList<String> results = new ArrayList<String>();
// Definieren Sie eine Stilvorlage mit regulären Ausdrücken. Der zu erfassende Inhalt steht in Klammern
Mustermuster = Pattern.compile(patternStr);
// Definiere einen Matcher für den Abgleich
Matcher matcher = pattern.matcher(targetStr);
// wenn gefunden
boolean isFind = matcher.find();
// Verwenden Sie eine Schleife, um alle Kelvin im Satz zu finden und zu ersetzen und den Inhalt zu jdm hinzuzufügen
while (isFind) {
//Erfolgreiche Matching-Ergebnisse hinzufügen
results.add(matcher.group(1));
// Weiter nach dem nächsten passenden Objekt suchen
isFind = matcher.find();
}
Ergebnisse zurückgeben;
}
public static void main(String[] args) {
// Definieren Sie den Link, der besucht werden soll
String url = "http://www.zhihu.com/explore/recommendations";
//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
ArrayList<String> imgSrc = RegexString(result, "question_link.+?>(.+?)<");
// Ergebnisse drucken
System.out.println(imgSrc);
}
}
Dadurch werden alle Ergebnisse abgeglichen (da die ArrayList direkt gedruckt wird, gibt es einige eckige Klammern und Kommas):
OK, dies ist der erste Schritt des Zhihu-Crawlers.
Aber wir sehen, dass es keine Möglichkeit gibt, alle Fragen und Antworten auf diese Weise zu erfassen.
Wir müssen eine Zhihu-Kapselungsklasse entwerfen, um alle erfassten Objekte zu speichern.
Zhihu.java-Quellcode:
import java.util.ArrayList;
öffentliche Klasse Zhihu {
öffentliche String-Frage; // Frage
public String zhihuUrl;//Webseitenlink
public ArrayList<String> Antworten; // Array zum Speichern aller Antworten
// Konstruktor initialisiert Daten
öffentliches Zhihu() {
Frage = "";
zhihuUrl = "";
Antworten = new ArrayList<String>();
}
@Override
öffentlicher String toString() {
return „Frage:“ + Frage + „/nLink:“ + zhihuUrl + „/nAnswer:“ + Antworten + „/n“;
}
}
Erstellen Sie eine neue Spider-Klasse, um einige häufig verwendete Crawlerfunktionen zu speichern.
Spider.java-Quellcode:
import java.io.BufferedReader;
import java.io.InputStreamReader;
java.net.URL importieren;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
öffentliche Klasse Spider {
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(), „UTF-8“));
// 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 ArrayList<Zhihu> GetZhihu(String content) {
// Definieren Sie eine ArrayList vor, um die Ergebnisse zu speichern
ArrayList<Zhihu> results = new ArrayList<Zhihu>();
// Wird zum Abgleichen von Titeln verwendet
Muster questionsPattern = Pattern.compile("question_link.+?>(.+?)<");
Matcher questionsMatcher = questionsPattern.matcher(content);
// Wird verwendet, um die URL abzugleichen, die den Link zur Frage darstellt
Muster urlPattern = Pattern.compile("question_link.+?href=/"(.+?)/"");
Matcher urlMatcher = urlPattern.matcher(content);
// Sowohl die Frage als auch der Link müssen übereinstimmen
boolean isFind = questionsMatcher.find() && urlMatcher.find();
while (isFind) {
//Definieren Sie ein Zhihu-Objekt zum Speichern der erfassten Informationen
Zhihu zhuhuTemp = new Zhihu();
zhuhuTemp.question = questionsMatcher.group(1);
zhuhuTemp.zhihuUrl = "http://www.zhihu.com" + urlMatcher.group(1);
//Erfolgreiche Matching-Ergebnisse hinzufügen
results.add(zhuhuTemp);
// Weiter nach dem nächsten passenden Objekt suchen
isFind = questionsMatcher.find() && urlMatcher.find();
}
Ergebnisse zurückgeben;
}
}
Die letzte Hauptmethode ist für den Aufruf verantwortlich.
import java.util.ArrayList;
öffentliche Klasse Main {
public static void main(String[] args) {
// Definieren Sie den Link, der besucht werden soll
String url = "http://www.zhihu.com/explore/recommendations";
//Greifen Sie auf den Link zu und rufen Sie den Seiteninhalt ab
String-Inhalt = Spider.SendGet(url);
// Alle Zhihu-Objekte auf dieser Seite abrufen
ArrayList<Zhihu> myZhihu = Spider.GetZhihu(content);
// Ergebnisse drucken
System.out.println(myZhihu);
}
}
Ok, das ist es. Führen Sie es aus und sehen Sie sich die Ergebnisse an:
Gute Ergebnisse.
Der nächste Schritt besteht darin, auf den Link zuzugreifen und alle Antworten zu erhalten.
Wir werden es das nächste Mal vorstellen.
Okay, das Obige ist eine kurze Einführung in den gesamten Prozess der Verwendung von Java zum Erfassen von Inhalten, der von Zhihu-Redakteuren empfohlen wird. Es ist sehr detailliert und leicht zu verstehen. Freunde in Not können sich darauf beziehen und es frei erweitern, haha