초기 단계에서 우리는 다음 링크에서 제목을 크롤링했습니다:
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; }
다음 단계는 각 부품을 구하는 것입니다.
먼저 제목을 살펴보겠습니다.
정규문은 다음과 같이 작성할 수 있습니다. -editable-content"> (.+?)<
실행하여 결과를 확인하세요.
아, 나쁘지 않네요.
다음으로 문제 설명을 가져옵니다.
아하, 같은 원리로 클래스를 가져옵니다. 클래스가 이것의 고유 식별자여야 하기 때문입니다. 🎜>확인 방법: 페이지 소스 코드를 보려면 마우스 오른쪽 버튼을 클릭하고, 페이지에 이와 같은 다른 문자열이 있는지 확인하려면 Ctrl+F를 사용하세요.
나중에 문제가 있는 것으로 확인되었습니다.
제목 앞의 클래스와 설명 내용이 동일합니다.
그러면 다시 가져오기만 가능합니다. 정규 패턴을 수정하여:
마지막으로 가져오기를 반복하는 것입니다. 답변:// 匹配标题 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); }
예비 임시 정규 명령문: /answer/content .+?
코드를 변경한 후에는 각 웹 페이지를 방문해야 하고
예를 들어 편집자가 추천한 질문이 20개라면 웹페이지를 20번 방문해야 속도가 느려집니다.
해 보세요. 잘 되는 것 같습니다:
그럼 일단 좋습니다~ 다음에는 계속해서 멀티스레딩, IO 스트림 등 세세한 조정을 해보겠습니다.
위 내용은 Java Zhihu 크롤러 작성에 대한 기본 지식입니다. 답변 내용은 PHP 중국어 홈페이지(www.php. cn) 더 많은 관련 콘텐츠를 보시려면