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 :
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 :
Oh, pas mal.
Ensuite, récupérez la description du problème :
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 :
.
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 :
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. :
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. !