Maison >Java >javaDidacticiel >Écrivez un robot Java Zhihu sans fondation pour obtenir le contenu recommandé par les éditeurs Zhihu (2)

Écrivez un robot Java Zhihu sans fondation pour obtenir le contenu recommandé par les éditeurs Zhihu (2)

黄舟
黄舟original
2016-12-24 11:26:511199parcourir

Les pages Web peuvent définir l'encodage de la page Web via le jeu de caractères de la balise méta, par exemple :

<meta charset="utf-8" />

Nous faisons un clic droit pour afficher le code source de la page :

Écrivez un robot Java Zhihu sans fondation pour obtenir le contenu recommandé par les éditeurs Zhihu (2)

Comme vous pouvez le voir, Zhihu utilise l'encodage UTF-8.

Ici, je vais vous expliquer la différence entre visualiser le code source de la page et inspecter les éléments.

L'affichage du code source de la page affiche tout le code de la page entière. Il n'est pas formaté selon les balises HTML. Cela équivaut à afficher directement le code source. Cette méthode est plus utile pour afficher les informations de la page. page Web entière, telle que méta.

Inspecter l'élément, ou certains navigateurs l'appellent view element, qui consiste à afficher l'élément sur lequel vous cliquez avec le bouton droit, comme un div ou un img. Il est plus approprié pour afficher les attributs et les balises d'un objet individuellement.

D'accord, nous savons maintenant que le problème réside dans l'encodage, et la prochaine étape consiste à convertir l'encodage du contenu capturé.

C'est très simple à implémenter en java. Il vous suffit de spécifier la méthode d'encodage dans le InputStreamReader :

// 初始化 BufferedReader输入流来读取URL的响应
   in = new BufferedReader(new InputStreamReader(
     connection.getInputStream(),"UTF-8"));

Exécutez à nouveau le programme à ce moment et vous constaterez que le titre. peut être affiché normalement :

Écrivez un robot Java Zhihu sans fondation pour obtenir le contenu recommandé par les éditeurs Zhihu (2)

D'accord ! très bien!

Mais maintenant il n'y a qu'un seul titre, il nous faut tous les titres.

Nous modifions légèrement l'expression régulière et stockons les résultats recherchés dans une 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);
 }
}

De cette façon, tous les résultats peuvent correspondre (car l'ArrayList est imprimée directement, elle sera Il y a quelques crochets et virgules) :
Écrivez un robot Java Zhihu sans fondation pour obtenir le contenu recommandé par les éditeurs Zhihu (2)

OK, c'est la première étape du robot d'exploration Zhihu.

Mais nous pouvons voir qu'il n'y a aucun moyen de capturer toutes les questions et réponses de cette manière.

Nous devons concevoir une classe d'encapsulation Zhihu pour stocker tous les objets capturés.



Ce qui précède est le contenu de l'écriture du robot Java Zhihu avec aucune connaissance de base pour obtenir le contenu recommandé par l'éditeur Zhihu (2). Pour plus de contenu connexe, veuillez faire attention. sur le site Web PHP chinois (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn