나는 전에 많은 단일 페이지 파이썬 크롤러를 썼으며, 파이썬이 여전히 매우 유용하다고 생각합니다. 여기서는 Java를 사용하여 다중 페이지 크롤러를 요약하고 종자 페이지의 모든 링크를 반복적으로 크롤링하고 TMP 경로 아래에 모두 저장합니다.
1. 서문
이 크롤러를 구현하려면 두 가지 데이터 구조의 지원이 필요합니다. 방문되지 않은 큐 (PriorityQueue : URL의 중요성을 계산할 수 있음)와 방문 테이블 (Hashset : URL이 존재하는지 신속하게 찾을 수 있음). 대기열은 너비 우선 크롤링을 구현하는 데 사용되며 방문 된 테이블은 크롤링 된 URL을 기록하는 데 사용됩니다. Java Crawlers가 요구하는 툴킷에는 HTTPCLIENT 및 HTMLPARSER1.5가 포함되며 Maven Repo에서 특정 버전의 다운로드를 볼 수 있습니다.
1. 대상 웹 사이트 : Sina http://www.sina.com.cn/
2. 결과의 스크린 샷 :
크롤러 구현에 대해 이야기합시다. 소스 코드는 나중에 Github에 업로드됩니다. 필요한 친구는 메시지를 남길 수 있습니다.
2. 크롤러 프로그래밍
1. 시드 페이지의 URL을 만듭니다
MyCrawler Crawler = New MyCrawler ();
crawler.crawling (new String [] { "http://www.sina.com.cn/"});
2. 위의 시드 URL로 방문하지 않은 테이블을 초기화하십시오.
linkqueue.addunvisitedUrl (씨앗 [i]);
3. 가장 중요한 논리적 구현 부분 : 대기열에서 방문하지 않은 URL을 꺼내고 다운로드 한 다음 방문 된 테이블을 추가하고 변경된 URL 페이지의 다른 URL을 구문 분석 한 다음 읽지 않은 대기열을 방문하지 않은 대기열에 추가하십시오. 대기열이 비어있을 때까지 반복 하므로이 URL 네트워크는 여전히 매우 큽니다. 여기서 페이지 다운로드 및 페이지 해상도에는 Java Toolkit 구현이 필요하며 툴킷 사용은 아래에 자세히 설명되어 있습니다.
while (! linkqueue.unvisitedUrlSempty () && linkqueue.getVisiteDurlNum () <= 1000) {// 헤더 URL은 큐 문자열에서 나옵니다. if (visiturl == null) 계속; downloadfile downloadfile downloader = new downloadfile (); // 웹 페이지 다운로드 다운로드 Downloader.DownloadFile (visiturl); // URL은 방문한 URL LinkQueue.AddVisitedUrl (visiturl)에 배치됩니다. // 다운로드 웹 페이지에서 URL을 추출 세트 <string> 링크 = htmlparsertool.extraclinks (visiturl, 필터); // 새로운 방문되지 않은 URL join for (문자열 링크 : links) {linkqueue.addunvisitedUrl (link); }}4. 다음 HTML 페이지의 툴킷 다운로드
public String downloadFile (String URL) {String FilePath = null; / * 1. httpclinet 객체를 생성하고 매개 변수 */ httpclient httpclient = new httpclient (); // 5S httpclient.gethttpConnectionManager ()에 대한 HTTP 연결 시간 초과 설정. getParams (). setConnectionTimeout (5000); / * 2. getMethod 객체를 생성하고 매개 변수를 설정 */ getMethod getMethod = new getMethod (url); // 5s get method.getParams (). setParameter (httpmethodparams.so_timeout, 5000)에 대한 요청 시간 초과 설정; // 요청 레트리 처리 설정 getMethod.getParams (). setParameter (httpmethodparams.retry_handler, new defaulthtpmethodretryhandler ()); /* 3. HTTP get request*/ try {int statusCode = httpclient.executemethod (getMethod); // 액세스 상태 코드를 결정합니다. filepath = null; }/* 4. 프로세스 http 응답 내용*/byte [] response body = getMethod.getResponseBody (); // 바이트 배열로 읽습니다. // 웹 페이지에 따라 저장할 때 파일 이름을 생성합니다. Savetolocal (응답 바디, FilePath); } catch (httpexception e) {// 치명적인 예외가 발생했습니다. 프로토콜이 잘못되었거나 반환 된 컨텐츠 시스템에 문제가있을 수 있습니다. e.printstacktrace (); } catch (ioexception e) {// 네트워크 예외가 발생했습니다. e.printstacktrace (); } 마지막으로 {// 연결을 릴리스하기 getMethod.releaseConnection (); } 반환 FilePath; }5. HTML 페이지 구문 분석 툴킷 :
public static set <string> Extraclinks (String URL, LinkFilter Filter) {set <string> links = new Hashset <string> (); try {parser parser = new Parser (URL); parser.setencoding ( "GB2312"); // 프레임 태그 NodeFilter FrameFilter = New NodeFilter () {public boolean accept (Node Node) {if (node.getText (). startStwith ( "frame src =")) {return true; } else {return false; }}}}; // 필터링 <a> 태그를 설정하려면 orfilter 및 <frame> 태그 orfilter linkfilter = new Orfilter (new nodeclassfilter (linktag.class), framefilter); // 필터링 된 모든 태그를 가져옵니다. NODELIST LIST = PARSER.EXTARTOLLNODEDESTHATMATCH (LinkFilter); for (int i = 0; i <list.size (); i ++) {node tag = list.elementat (i); if (linktag의 태그 인스턴스) // <a> tag {linktag link = (linktag) tag; String linkurl = link.getLink (); // url if (filter.accept (linkurl)) links.add (linkurl); } else // <frame> tag {// <frame src = "test.html"/> strame = tag.getText (); int start = frame.indexof ( "src ="); frame = frame.substring (시작); int end = frame.indexof ( ""); if (end == -1) end = frame.indexof ( ">"); 문자열 frameurl = frame.substring (5, end -1); if (filter.accept (frameurl)) links.add (frameurl); }}} catch (parserexception e) {e.printstacktrace (); } 리턴 링크; }6. 방문되지 않은 페이지는 주로 PageRank와 같은 알고리즘에 적용하기 위해 우선 큐가있는 PriorityQueue를 사용하여 저장됩니다. 일부 URL은 더 충성합니다. 방문 된 테이블은 해시 세트를 사용하여 구현되며, 그것이 존재하는지 신속하게 찾는 데주의를 기울입니다.
공개 클래스 Linkqueue {// 액세스 URL 컬렉션 개인 정적 세트 visitedUrl = new Hashset (); // 액세스 URL 컬렉션 개인 정적 큐 unvisitedUrl = new PriorityQueue (); // URL 큐를 가져옵니다 public static queue getUnvisitedUrl () {return UnvisitedUrl; } // 방문한 URL 큐에 추가 공개 정적 void addvisitedUrl (String URL) {visitedUrl.add (url); } // 액세스 된 URL 제거 공용 정적 무효 제거 removevisitedUrl (String URL) {visitedUrl.remove (url); } // 비 이동되지 않은 URL은 큐에서 벗어났습니다. 공개 정적 개체 unvisitedUrldequeue () {return unvisitedUrl.poll (); } // 각 URL이 공개 정적 void AddUnvisitedUrl (String URL) {if (url! = null &&! url.tim.trim ( ""). } // 공개 정적 int getvisitedUrlnum () {return visitedUrl.size (); } // 방문하지 않은 URL 큐가 빈 공개 정적 부울 UnvisitedUrlSempty () {return unvisitedUrl.isempty (); }}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.