Zhihu の回答をクロールするためのゼロ基礎を備えた Java Zhihu クローラーを作成する

黄舟
リリース: 2016-12-24 11:41:34
オリジナル
1434 人が閲覧しました

初期段階では、次のリンクの下にあるタイトルをクロールしました:

http://www.zhihu.com/explore/recommendations

しかし、明らかにこのページでは答えを得ることができません。

完全な質問ページは次のリンクのようになります:

http://www.zhihu.com/question/22355264

注意深く見てみると、ああ、カプセル化クラスをさらにパッケージ化する必要があります。少なくとも質問の説明が必要です。問題の説明を保存します:

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";
 }
}
ログイン後にコピー

URL 値を設定するパラメーターを Zhihu コンストラクターに追加します。URL が決定されるため、問題の説明と回答を取得できます。

Zhihu オブジェクトを取得する Spider のメソッドを変更し、URL のみを取得します:

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;
 }
ログイン後にコピー

次のステップは、Zhihu の構築メソッドの URL を通じてすべての詳細データを取得することです。

一部は回答用であるため、最初に URL を処理する必要があります。その URL は次のとおりです:

http://www.zhihu.com/question/22355264/answer/21102139

一部は質問用で、その URL は:

http://www.zhihu.com/question/22355264

次に、明らかに 2 番目のタイプが必要なので、正規表現を使用して最初のタイプのリンクを 2 番目のタイプに切り分ける必要があります。関数を記述するだけです。これについてはZhihuで。

// 处理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;
 }
ログイン後にコピー

次のステップは各パーツの入手です。

まずタイトルを見てください:

Zhihu の回答をクロールするためのゼロ基礎を備えた Java Zhihu クローラーを作成する

クラスを理解するだけです。通常のステートメントは次のように記述できます: zm-editable-content">(.+?)<

それを実行して結果を確認してください。 :

Zhihu の回答をクロールするためのゼロ基礎を備えた Java Zhihu クローラーを作成する

ああ、それはいいですね

次に、問題の説明を取得します:

Zhihu の回答をクロールするためのゼロ基礎を備えた Java Zhihu クローラーを作成する

ああ、同じ原理で、クラスを取得します。これは、この一意の識別子である必要があるためです

検証方法: そうですね。 -クリックしてページを表示し、ctrl+F でページ内に他の文字列があるかどうかを確認します。

確認後、実際に問題があります:

Zhihu の回答をクロールするためのゼロ基礎を備えた Java Zhihu クローラーを作成する


タイトルの前のクラス。と説明内容は同じです

その後、正規表現を変更して再取得するだけです:

// 匹配标题
   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);
   }
ログイン後にコピー

最後に、答えを取得するループです:

Zhihu の回答をクロールするためのゼロ基礎を備えた Java Zhihu クローラーを作成する

暫定的な暫定的な正規文: /answer/content .+?

コードを変更すると、各 Web ページにアクセスしてコンテンツをキャプチャする必要があるため、ソフトウェアの実行が大幅に遅くなることがわかります。

たとえば、編集者の推奨事項が 20 個ある場合、Web ページに 20 回アクセスする必要があり、速度が遅くなります

試してみると、うまくいくようです:

Zhihu の回答をクロールするためのゼロ基礎を備えた Java Zhihu クローラーを作成する

OK、今回はここまでです~マルチスレッド、ローカルへのIOストリーム書き込みなどの調整を次回に続けましょう。

上記は、Zhihuの回答をクロールするためのJava Zhihuクローラーを作成する内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php)


に注目してください。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート