Web ページでは、メタ タグの文字セットを通じて Web ページのエンコードを設定できます。例:
<meta charset="utf-8" />
右クリックしてページのソース コードを表示します:
Zhihu が UTF-8 エンコードを使用していることがわかります。
ここでは、ページのソースコードの表示と要素の検査の違いについて説明します。
ページのソースコードを表示すると、HTML タグに従ってフォーマットされていません。この方法は、Web ページ全体の情報を表示する場合に便利です。メタなど。
Inspect 要素、または一部のブラウザでは view 要素と呼ばれます。これは、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<String> RegexString(String targetStr, String patternStr) { // 预定义一个ArrayList来存储结果 ArrayList<String> results = new ArrayList<String>(); // 定义一个样式模板,此中使用正则表达式,括号中是要抓的内容 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<String> imgSrc = RegexString(result, "question_link.+?>(.+?)<"); // 打印结果 System.out.println(imgSrc); } }
このようにして、すべての結果を照合できます (ArrayList が直接出力されるため、いくつかの角括弧とカンマが含まれます):
OK、これが Zhihu クローラーの最初のステップです。
しかし、この方法ですべての質問と回答を取得する方法がないことがわかります。
キャプチャされたすべてのオブジェクトを保存するために Zhihu カプセル化クラスを設計する必要があります。
上記は、Zhihu 編集者が推奨するコンテンツを取得するために、基礎知識ゼロで Java Zhihu クローラーを作成する内容です (2) 関連コンテンツの詳細については、PHP 中国語 Web サイト (www.php.cn) をご覧ください。 )!