Heim > Java > javaLernprogramm > Hauptteil

Schreiben Sie einen Java Zhihu-Crawler ohne Fundament, um Zhihu-Antworten zu crawlen

黄舟
Freigeben: 2016-12-24 11:41:34
Original
1434 Leute haben es durchsucht

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";
 }
}
Nach dem Login kopieren

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;
 }
Nach dem Login kopieren

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;
 }
Nach dem Login kopieren

Der nächste Schritt besteht darin, jedes Teil zu erhalten.

Werfen wir zunächst einen Blick auf den Titel:

Schreiben Sie einen Java Zhihu-Crawler ohne Fundament, um Zhihu-Antworten zu crawlen

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:

Schreiben Sie einen Java Zhihu-Crawler ohne Fundament, um Zhihu-Antworten zu crawlen

Oh, nicht schlecht.

Als nächstes schnappen Sie sich die Problembeschreibung:

Schreiben Sie einen Java Zhihu-Crawler ohne Fundament, um Zhihu-Antworten zu crawlen

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:

Schreiben Sie einen Java Zhihu-Crawler ohne Fundament, um Zhihu-Antworten zu crawlen


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);
   }
Nach dem Login kopieren

Schreiben Sie einen Java Zhihu-Crawler ohne Fundament, um Zhihu-Antworten zu crawlen 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:

Schreiben Sie einen Java Zhihu-Crawler ohne Fundament, um Zhihu-Antworten zu crawlenOK, 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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage