Heim >Java >javaLernprogramm >Schreiben Sie einen Java Zhihu-Crawler ohne Fundament, um Zhihu-Antworten zu crawlen
In der Anfangsphase haben wir den Titel unter diesem Link gecrawlt:
http://www.zhihu.com/explore/recommendations
Aber offensichtlich kann diese Seite die Antwort nicht finden.
Eine vollständige Fragenseite sollte ein Link wie dieser sein:
http://www.zhihu.com/question/22355264
Schauen Sie genau hin, aha, unsere Kapselungsklasse Es ist mindestens eine Fragebeschreibung erforderlich, um die Beschreibung der Frage zu speichern:
import java.util.ArrayList; public class Zhihu { public String question;// 问题 public String questionDescription;// 问题描述 public String zhihuUrl;// 网页链接 public ArrayList<String> answers;// 存储所有回答的数组 // 构造方法初始化数据 public Zhihu() { question = ""; questionDescription = ""; zhihuUrl = ""; answers = new ArrayList<String>(); } @Override public String toString() { return "问题:" + question + "\n" + "描述:" + questionDescription + "\n" + "链接:" + zhihuUrl + "\n回答:" + answers + "\n"; } }
Wir fügen dem Zhihu-Konstruktor einen Parameter hinzu, um den URL-Wert festzulegen, da die URL bestimmt wird Antwort auf diese Frage sind beide verfügbar.
Wir werden Spiders Methode zum Abrufen von Zhihu-Objekten ändern und nur die URL abrufen:
static ArrayList<Zhihu> GetZhihu(String content) { // 预定义一个ArrayList来存储结果 ArrayList<Zhihu> results = new ArrayList<Zhihu>(); // 用来匹配url,也就是问题的链接 Pattern urlPattern = Pattern.compile("<h2>.+?question_link.+?href=\"(.+?)\".+?</h2>"); Matcher urlMatcher = urlPattern.matcher(content); // 是否存在匹配成功的对象 boolean isFind = urlMatcher.find(); while (isFind) { // 定义一个知乎对象来存储抓取到的信息 Zhihu zhihuTemp = new Zhihu(urlMatcher.group(1)); // 添加成功匹配的结果 results.add(zhihuTemp); // 继续查找下一个匹配对象 isFind = urlMatcher.find(); } return results; }
Als nächstes erhalten Sie in Zhihus Konstruktionsmethode alle Objekte über die URL. Detaillierte Daten.
Wir müssen zuerst die URL verarbeiten, da einige für Antworten gedacht sind. Die URL lautet:
http://www.zhihu.com/question/22355264/answer/21102139
Einige sind für Fragen, die URL lautet:
http://www.zhihu.com/question/22355264
Dann haben wir offensichtlich das, was benötigt wird der zweite Typ, daher müssen Sie reguläre Regeln verwenden, um den ersten Linktyp in den zweiten Typ zu schneiden. Dies kann durch Schreiben einer Funktion in Zhihu erfolgen.
// 处理url boolean getRealUrl(String url) { // 将http://www.zhihu.com/question/22355264/answer/21102139 // 转化成http://www.zhihu.com/question/22355264 // 否则不变 Pattern pattern = Pattern.compile("question/(.*?)/"); Matcher matcher = pattern.matcher(url); if (matcher.find()) { zhihuUrl = "http://www.zhihu.com/question/" + matcher.group(1); } else { return false; } return true; }
Der nächste Schritt besteht darin, jedes Teil zu erhalten.
Werfen wir zunächst einen Blick auf den Titel:
Begreifen Sie diese Klasse einfach in regulärer Form. Die reguläre Anweisung kann wie folgt geschrieben werden: zm -editable-content"> (.+?)
Führen Sie es aus und sehen Sie sich das Ergebnis an:
Oh, nicht schlecht.
Als nächstes schnappen Sie sich die Problembeschreibung:
Aha, das gleiche Prinzip, schnappen Sie sich die Klasse, denn sie sollte der eindeutige Bezeichner dafür sein 🎜>Überprüfungsmethode: Klicken Sie mit der rechten Maustaste, um den Quellcode der Seite anzuzeigen, und drücken Sie Strg+F, um zu sehen, ob die Seite weitere Zeichenfolgen wie diese enthält.
Später wurde überprüft, dass etwas schief gelaufen ist:
Der Inhalt der Klasse vor dem Titel und der Beschreibung ist derselbe
Dann können Sie ihn nur erneut abrufen durch Modifizieren des regulären Musters:
Das Letzte ist, den Abruf in einer Schleife durchzuführen. Antwort:// 匹配标题 pattern = Pattern.compile("zh-question-title.+?<h2.+?>(.+?)</h2>"); matcher = pattern.matcher(content); if (matcher.find()) { question = matcher.group(1); } // 匹配描述 pattern = Pattern .compile("zh-question-detail.+?<div.+?>(.*?)</div>"); matcher = pattern.matcher(content); if (matcher.find()) { questionDescription = matcher.group(1); }
Vorläufige vorläufige reguläre Anweisung: /answer/content .+?
Nach der Änderung des Codes werden wir feststellen, dass die Software deutlich langsamer läuft, da sie jede Webseite besuchen muss und Erfassen Sie den Inhalt darauf.
Wenn der Herausgeber beispielsweise 20 Fragen empfiehlt, müssen Sie die Webseite 20 Mal besuchen.
Versuchen Sie es Es scheint gut zu funktionieren:
OK, dann ist das gut~ Beim nächsten Mal werde ich weiterhin einige detaillierte Anpassungen vornehmen, wie z. B. Multithreading, IO-Stream Schreiben an lokal usw.
Das Obige ist das Grundwissen zum Schreiben von Java Zhihu Crawler. Bezüglich des Inhalts der Antwort achten Sie bitte auf die chinesische PHP-Website (www.php. cn) für weitere verwandte Inhalte!