> Java > java지도 시간 > 본문

Zhihu 답변을 크롤링하기 위해 기초가 전혀 없는 Java Zhihu 크롤러 작성

黄舟
풀어 주다: 2016-12-24 11:41:34
원래의
1386명이 탐색했습니다.

초기 단계에서 우리는 다음 링크에서 제목을 크롤링했습니다:

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

그러나 분명히 이 페이지에서는 답변을 얻을 수 없습니다.

완전한 질문 페이지는 다음과 같은 링크여야 합니다.

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

자세히 살펴보세요. 아하 우리 캡슐화 수업 질문 설명을 저장하려면 최소한 QuestionDescription이 필요합니다.

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";
 }
}
로그인 후 복사

URL이 결정되므로 URL 값을 설정하기 위해 Zhihu 생성자에 매개변수를 추가합니다. 이 질문에 대한 답변은 둘 다 가능합니다.

Spider의 Zhihu 객체 획득 방식을 변경하고 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;
 }
로그인 후 복사

다음으로 Zhihu의 구축 방식에서는 url 상세 데이터를 통해 모든 객체를 획득합니다.

URL을 먼저 처리해야 합니다. 일부는 답변용이므로 해당 URL은 다음과 같습니다.

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

일부는 질문용이며 해당 URL은 다음과 같습니다.

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

그러면 우리에게 필요한 것은 분명히 다음과 같습니다. 따라서 첫 번째 유형의 링크를 두 번째 유형으로 자르려면 일반 규칙을 사용해야 합니다. 이는 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;
 }
로그인 후 복사

다음 단계는 각 부품을 구하는 것입니다.

먼저 제목을 살펴보겠습니다.

Zhihu 답변을 크롤링하기 위해 기초가 전혀 없는 Java Zhihu 크롤러 작성

정규문은 다음과 같이 작성할 수 있습니다. -editable-content"> (.+?)<

실행하여 결과를 확인하세요.

Zhihu 답변을 크롤링하기 위해 기초가 전혀 없는 Java Zhihu 크롤러 작성

아, 나쁘지 않네요.

다음으로 문제 설명을 가져옵니다.

Zhihu 답변을 크롤링하기 위해 기초가 전혀 없는 Java Zhihu 크롤러 작성

아하, 같은 원리로 클래스를 가져옵니다. 클래스가 이것의 고유 식별자여야 하기 때문입니다. 🎜>확인 방법: 페이지 소스 코드를 보려면 마우스 오른쪽 버튼을 클릭하고, 페이지에 이와 같은 다른 문자열이 있는지 확인하려면 Ctrl+F를 사용하세요.

나중에 문제가 있는 것으로 확인되었습니다.

Zhihu 답변을 크롤링하기 위해 기초가 전혀 없는 Java Zhihu 크롤러 작성


제목 앞의 클래스와 설명 내용이 동일합니다.

그러면 다시 가져오기만 가능합니다. 정규 패턴을 수정하여:

마지막으로 가져오기를 반복하는 것입니다. 답변:
// 匹配标题
   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);
   }
로그인 후 복사

Zhihu 답변을 크롤링하기 위해 기초가 전혀 없는 Java Zhihu 크롤러 작성 예비 임시 정규 명령문: /answer/content .+?

(.*?)

코드를 변경한 후에는 각 웹 페이지를 방문해야 하고

예를 들어 편집자가 추천한 질문이 20개라면 웹페이지를 20번 방문해야 속도가 느려집니다.

해 보세요. 잘 되는 것 같습니다:

Zhihu 답변을 크롤링하기 위해 기초가 전혀 없는 Java Zhihu 크롤러 작성 그럼 일단 좋습니다~ 다음에는 계속해서 멀티스레딩, IO 스트림 등 세세한 조정을 해보겠습니다.



위 내용은 Java Zhihu 크롤러 작성에 대한 기본 지식입니다. 답변 내용은 PHP 중국어 홈페이지(www.php. cn) 더 많은 관련 콘텐츠를 보시려면


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!