ホームページ >Java >&#&チュートリアル >Zhihu の回答をクロールするためのゼロ基礎を備えた Java Zhihu クローラーを作成する
初期段階では、次のリンクの下にあるタイトルをクロールしました:
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; }
次のステップは各パーツの入手です。
まずタイトルを見てください:
クラスを理解するだけです。通常のステートメントは次のように記述できます: zm-editable-content">(.+?)
それを実行して結果を確認してください。 :
ああ、それはいいですね
次に、問題の説明を取得します:
ああ、同じ原理で、クラスを取得します。これは、この一意の識別子である必要があるためです
検証方法: そうですね。 -クリックしてページを表示し、ctrl+F でページ内に他の文字列があるかどうかを確認します。
確認後、実際に問題があります:
タイトルの前のクラス。と説明内容は同じです
その後、正規表現を変更して再取得するだけです:
// 匹配标题 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); }
最後に、答えを取得するループです:
暫定的な暫定的な正規文: /answer/content .+?
コードを変更すると、各 Web ページにアクセスしてコンテンツをキャプチャする必要があるため、ソフトウェアの実行が大幅に遅くなることがわかります。
たとえば、編集者の推奨事項が 20 個ある場合、Web ページに 20 回アクセスする必要があり、速度が遅くなります
試してみると、うまくいくようです:
OK、今回はここまでです~マルチスレッド、ローカルへのIOストリーム書き込みなどの調整を次回に続けましょう。
上記は、Zhihuの回答をクロールするためのJava Zhihuクローラーを作成する内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php)