ゼロベースJava知乎爬虫類の取得知乎編集推奨内容

9787 ワード

真実のネット問答コミュニティであることを知っていて、コミュニティの雰囲気は友好的で、理性的で、まじめで、各業界のエリートを接続しています.彼らはお互いの専門知識、経験と見解を分かち合い、中国語のインターネットに絶えず高品質の情報を提供している.
まず3、5分かけてロゴ=をデザインします.=プログラマーとして私はずっと美工をする心を持っています!
まあ、ちょっと間に合わせたので、先に間に合わせて使いましょう.
次に、私たちは知っている爬虫類を作り始めました.
まず、最初のターゲットを決定します.推奨を編集します.
Webリンク:http://www.zhihu.com/explore/recommendations
前回のコードを少し変更して、ページの内容を取得することができます.
import java.io.*;
import java.net.*;
import java.util.regex.*;
public class Main {
 static String SendGet(String url) {
  //
  String result = "";
  //
  BufferedReader in = null;
  try {
   // string url
   URL realUrl = new URL(url);
   // url
   URLConnection connection = realUrl.openConnection();
   //
   connection.connect();
   // BufferedReader URL
   in = new BufferedReader(new InputStreamReader(
     connection.getInputStream()));
   //
   String line;
   while ((line = in.readLine()) != null) {
    // result
    result += line;
   }
  } catch (Exception e) {
   System.out.println(" GET !" + e);
   e.printStackTrace();
  }
  // finally
  finally {
   try {
    if (in != null) {
     in.close();
    }
   } catch (Exception e2) {
    e2.printStackTrace();
   }
  }
  return result;
 }
 static String RegexString(String targetStr, String patternStr) {
  // , ,
  //
  Pattern pattern = Pattern.compile(patternStr);
  // matcher
  Matcher matcher = pattern.matcher(targetStr);
  //
  if (matcher.find()) {
   //
   return matcher.group(1);
  }
  return "Nothing";
 }
 public static void main(String[] args) {
  //
  String url = "http://www.zhihu.com/explore/recommendations";
  //
  String result = SendGet(url);
  // src
  //String imgSrc = RegexString(result, "src=\"(.+?)\"");
  //
  System.out.println(result);
 }
}

木を動かすと問題があり、次は正則マッチングの問題です.
まず、このページのすべての問題を取得します.
見出しを右クリックし、要素を確認します.
ああ、タイトルは実はaラベル、つまりハイパーリンクであり、その中で他のハイパーリンクと区別できるのは、そのclass、つまりクラスセレクタであることがわかります.
そこで私たちの正則文が出てきました:question_link.+?href=\”(.+?)\”
RegexString関数を呼び出し、パラメータを渡します.
 public static void main(String[] args) {
  //
  String url = "http://www.zhihu.com/explore/recommendations";
  //
  String result = SendGet(url);
  // src
  String imgSrc = RegexString(result, "question_link.+?>(.+?)  //
  System.out.println(imgSrc);
 }

ああ、私たちが成功してタイトルを捕まえたのが見えます(注意して、ただの):
ちょっと待って、このごちゃごちゃしているのは何ですか?!
緊張しないで.文字が文字化けしているだけです.
コーディングの問題は、「HTML文字セット」を参照してください.
一般的に、中国語のサポートが良い主流の符号化はUTF-8、GB 2312、GBK符号化である.
ウェブページはmetaラベルのcharsetによってウェブページの符号化を設定することができ、例えば:

右クリックして、ページのソースコードを表示します.
UTF-8符号化が採用されていることがわかる.
ここでは、ページのソースコードの表示とレビュー要素の違いについて説明します.
ページのソースコードを表示することは、ページ全体を表示するすべてのコードであり、HTMLのラベルに従ってレイアウトされていないので、ソースコードを直接表示することに相当します.この方法は、metaなどのページ全体の情報を表示するのに役立ちます.
要素をレビューしたり、右クリックした要素をレビューしたりするブラウザがあります.divやimgなど、オブジェクトのプロパティやラベルを個別に表示するのに適しています.
はい、問題が符号化にあることがわかりました.次に、キャプチャした内容を符号化変換します.
Javaでの実装は簡単で、InputStreamReaderで符号化方法を指定するだけでいいです.
//     BufferedReader      URL   
   in = new BufferedReader(new InputStreamReader(
     connection.getInputStream(),"UTF-8"));

プログラムを再実行すると、タイトルが正常に表示されます.
はい.とてもいいです!
しかし、今はタイトルが1つしかありません.私たちに必要なのはすべてのタイトルです.
正則を少し修正し、検索結果をArrayListに保存します.
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.regex.*;
public class Main {
 static String SendGet(String url) {
  //
  String result = "";
  //
  BufferedReader in = null;
  try {
   // string url
   URL realUrl = new URL(url);
   // url
   URLConnection connection = realUrl.openConnection();
   //
   connection.connect();
   // BufferedReader URL
   in = new BufferedReader(new InputStreamReader(
     connection.getInputStream(), "UTF-8"));
   //
   String line;
   while ((line = in.readLine()) != null) {
    // result
    result += line;
   }
  } catch (Exception e) {
   System.out.println(" GET !" + e);
   e.printStackTrace();
  }
  // finally
  finally {
   try {
    if (in != null) {
     in.close();
    }
   } catch (Exception e2) {
    e2.printStackTrace();
   }
  }
  return result;
 }
 static ArrayList RegexString(String targetStr, String patternStr) {
  // ArrayList
  ArrayList results = new ArrayList();
  // , ,
  Pattern pattern = Pattern.compile(patternStr);
  // matcher
  Matcher matcher = pattern.matcher(targetStr);
  //
  boolean isFind = matcher.find();
  // kelvin sb
  while (isFind) {
   //
   results.add(matcher.group(1));
   //
   isFind = matcher.find();
  }
  return results;
 }
 public static void main(String[] args) {
  //
  String url = "http://www.zhihu.com/explore/recommendations";
  //
  String result = SendGet(url);
  // src
  ArrayList imgSrc = RegexString(result, "question_link.+?>(.+?)  //
  System.out.println(imgSrc);
 }
}

これですべての結果に一致します(ArrayListが直接印刷されているため、カッコとカンマがいくつかあります):
OK、これで知乎爬虫類を完成させる第一歩です.
しかし、このような方法ではすべての質問と答えをつかむことができないことがわかります.
キャプチャされたすべてのオブジェクトを格納するためにZhihuパッケージクラスを設計する必要があります.
Zhihu.javaソース:
import java.util.ArrayList;
public class Zhihu {
 public String question;//
 public String zhihuUrl;//
 public ArrayList answers;//
 //
 public Zhihu() {
  question = "";
  zhihuUrl = "";
  answers = new ArrayList();
 }
 @Override
 public String toString() {
  return " :" + question + "
:" + zhihuUrl + "
:" + answers + "
";
 }
}

爬虫類でよく使われる関数を格納するためにSpiderクラスを追加します.
Spider.javaソース:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Spider {
 static String SendGet(String url) {
  //
  String result = "";
  //
  BufferedReader in = null;
  try {
   // string url
   URL realUrl = new URL(url);
   // url
   URLConnection connection = realUrl.openConnection();
   //
   connection.connect();
   // BufferedReader URL
   in = new BufferedReader(new InputStreamReader(
     connection.getInputStream(), "UTF-8"));
   //
   String line;
   while ((line = in.readLine()) != null) {
    // result
    result += line;
   }
  } catch (Exception e) {
   System.out.println(" GET !" + e);
   e.printStackTrace();
  }
  // finally
  finally {
   try {
    if (in != null) {
     in.close();
    }
   } catch (Exception e2) {
    e2.printStackTrace();
   }
  }
  return result;
 }
 static ArrayList GetZhihu(String content) {
  // ArrayList
  ArrayList results = new ArrayList();
  //
  Pattern questionPattern = Pattern.compile("question_link.+?>(.+?)  Matcher questionMatcher = questionPattern.matcher(content);
  // url,
  Pattern urlPattern = Pattern.compile("question_link.+?href=\"(.+?)\"");
  Matcher urlMatcher = urlPattern.matcher(content);
  //
  boolean isFind = questionMatcher.find() && urlMatcher.find();
  while (isFind) {
   //
   Zhihu zhuhuTemp = new Zhihu();
   zhuhuTemp.question = questionMatcher.group(1);
   zhuhuTemp.zhihuUrl = "http://www.zhihu.com" + urlMatcher.group(1);
   //
   results.add(zhuhuTemp);
   //
   isFind = questionMatcher.find() && urlMatcher.find();
  }
  return results;
 }
}

最後のmainメソッドが呼び出しを担当します.
import java.util.ArrayList;
public class Main {
 public static void main(String[] args) {
  //
  String url = "http://www.zhihu.com/explore/recommendations";
  //
  String content = Spider.SendGet(url);
  //
  ArrayList myZhihu = Spider.GetZhihu(content);
  //
  System.out.println(myZhihu);
 }
}

Okこれで終わりだ.実行して結果を確認します.
良い効果はいいですね.
次はリンクにアクセスしてすべての答えを取得します.
次回はまたご紹介します.
では、Javaを使って、わかりやすい編集者のおすすめ内容をつかむ方法を簡単にご紹介しました.