Maison  >  Article  >  Java  >  Écrivez un robot Java Zhihu sans fondation pour explorer les réponses Zhihu

Écrivez un robot Java Zhihu sans fondation pour explorer les réponses Zhihu

黄舟
黄舟original
2016-12-24 11:41:341428parcourir

Au début, nous avons exploré le titre sous ce lien :

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

Mais évidemment, cette page ne peut pas obtenir la réponse.

Une page de questions complète devrait être un lien comme celui-ci :

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

Regardez attentivement, aha notre cours d'encapsulation doit être davantage emballé. Au moins une questionDescription est nécessaire pour stocker la description de la question :

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";
 }
}

Nous ajoutons un paramètre au constructeur Zhihu pour définir la valeur de l'url, car l'url est déterminée. Les réponses à cette question sont toutes deux disponibles.

Nous allons changer la méthode de Spider pour obtenir les objets Zhihu et obtenir uniquement l'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;
 }

Ensuite, dans la méthode de construction de Zhihu, obtenez tous les objets via l'URL Données détaillées.

Nous devons d'abord traiter l'URL, car certaines sont pour des réponses, son URL est :

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

Certaines sont pour les questions, son url est :

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

Ensuite, nous avons évidemment besoin de le deuxième type, vous devez donc utiliser des règles régulières pour couper le premier type de lien dans le deuxième type. Cela peut être fait en écrivant une fonction dans 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;
 }

La prochaine étape consiste à obtenir chaque pièce.

Jetons d'abord un coup d'œil au titre :

Écrivez un robot Java Zhihu sans fondation pour explorer les réponses Zhihu

Saisissez simplement cette classe sous sa forme régulière. L'instruction régulière peut s'écrire : zm. -editable-content"> (. ?)

Exécutez-le et voyez le résultat :

Écrivez un robot Java Zhihu sans fondation pour explorer les réponses Zhihu

Oh, pas mal.

Ensuite, récupérez la description du problème :

Écrivez un robot Java Zhihu sans fondation pour explorer les réponses Zhihu

Aha, le même principe, récupérez la classe, car elle devrait être l'identifiant unique de ceci

. Méthode de vérification : clic droit pour afficher le code source de la page. ctrl F pour voir s'il y a d'autres chaînes dans la page

Après vérification, il y a vraiment un problème :

Écrivez un robot Java Zhihu sans fondation pour explorer les réponses Zhihu.


La classe devant le titre et le contenu de la description sont les mêmes

Ensuite, vous ne pouvez la récupérer qu'en modifiant les règles habituelles :

// 匹配标题
   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);
   }

La dernière étape consiste à boucler pour récupérer la réponse :

Écrivez un robot Java Zhihu sans fondation pour explorer les réponses Zhihu

Déclaration régulière provisoire préliminaire : /answer/content ?

(.*?)

Après avoir modifié le code, nous constaterons que le logiciel fonctionne beaucoup plus lentement, car il doit visiter chaque page Web et capturer le contenu ci-dessus

Par exemple, s'il y a 20 questions recommandées par l'éditeur, alors c'est nécessaire. Après avoir visité la page Web 20 fois, la vitesse a ralenti

Essayez-le et cela semble bien fonctionner. :

Écrivez un robot Java Zhihu sans fondation pour explorer les réponses Zhihu

OK, faisons ça pour l'instant~ La prochaine fois, je continuerai à faire quelques ajustements détaillés, comme le multi-threading, l'écriture du flux IO en local, etc.

Ce qui précède est le contenu de l'écriture d'un robot Java Zhihu pour récupérer les réponses Zhihu à partir de zéro, veuillez faire attention au site Web PHP chinois (www.php.cn) pour plus de contenu connexe. !


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