기존 파충류는 하나 이상의 초기 웹 페이지의 URL 로 시작하여 초기 웹 페이지의 URL 을 가져옵니다. 웹 페이지를 등반하는 동안 시스템의 특정 중지 조건이 충족될 때까지 현재 페이지에서 새 URL 을 계속 추출하여 대기열에 넣습니다. 수직 검색의 경우 파충류, 즉 특정 주제 웹 페이지를 캡처하는 파충류에 더 적합합니다.
다음은 Java 를 사용하여 구현 된 간단한 크롤러 코어 코드입니다.
공용 void 크롤링 () Throwable {
While (continueCrawling()) {
Crawler URL URL = getnext URL (); //큐에서 크롤링할 다음 URL 을 가져옵니다.
만약 (웹 사이트! = null) {
Printcrawlinfo ();
Stringcontent = getcontent (URL); //URL 의 텍스트 정보 가져오기
//초점 파충류는 주제 내용과 관련된 웹 페이지만 캡처합니다. 여기서는 규칙 일치를 사용하여 간단하게 처리합니다.
If (iscontentrelevent (컨텐트, this.regexpSearchPattern)) {
SaveContent(url, 컨텐츠); //웹 페이지를 로컬로 저장합니다.
//웹 콘텐츠의 링크를 가져와서 대기열에 넣어 캡처합니다.
컬렉션 urlStrings = extractUrls (컨텐트, URL);
AddUrlsToUrlQueue(url, urlstrings);
} 그렇지 않으면 {
System.out.println(url+"관련없는 무시 ...");
}
//상대방에 의해 차폐되는 것을 방지하기 위해 연기
Thread.sleep (this.delaybetweenurls);
}
}
Closeoutputstream ();
}
Private CrawlerUrl getNextUrl () 에서 Throwable {
CrawlerUrl nextUrl = null
While ((next URL = = null) & & amp (! UrlQueue.isEmpty())) {
Crawler URL crawler URL = this.urlqueue.remove ();
//doWeHavePermissionToVisit: 이 URL 에 대한 액세스 권한이 있든 없든 친숙한 파충류는 웹 사이트에서 제공하는 "Robot.txt" 에 구성된 규칙에 따라 기어갑니다.
//IsurlReadyVisited:URL 에 액세스한 적이 있습니까? 대형 검색 엔진은 BloomFilter 를 사용하여 복사하는 경우가 많습니다. 여기, 간단히 HashMap 을 사용하세요.
///isdepthaceptable: 지정된 최대 깊이에 도달했는지 여부. 파충류는 일반적으로 폭 우선 접근 방식을 사용합니다. 일부 웹 사이트에서는 파충류 트랩 (자동으로 잘못된 링크를 생성하여 파충류를 사순환에 빠뜨림) 을 구축하고 깊이 제한을 적용하여 피합니다.
If (dowehavepermissiontovisit (crawler URL)
& amp& amp (! Isurlareadyvisited(crawler URL))
& amp& is depth acceptable (crawler URL)) {
NextUrl = crawlerUrl 입니다
// System.out.println ("다음에 액세스할 URL 은" Next URL "입니다
}
}
NextUrl 을 반환합니다
}
전용 문자열 getContent(CrawlerUrl) 가 Throwable {
//HttpClient4. 1 은 이전과 다르게 호출됩니다.
Http client client = new default http client ();
Http get http get = new http get (url.geturlstring ());
Stringbufferstrbuf = new stringbuffer ();
Httpresponseresponse = client.execute (http get);
If (http 상태. SC_OK == response.getStatusLine () 입니다. GetStatusCode()) {
Http entity entity = response.getentity ();
다음 경우 (엔티티! = null) {
BufferedReader reader = 새로운 BufferedReader (
Newinputstreamreader (entity.getcontent (), "utf-8");
String line = null
If (entity.getcontentlength () > 0) {
Strbuf = new stringbuffer ((int) entity.getcontentlength ());
While ((line = reader.readLine ())! = null) {
StrBuf.append (행);
}
}
}
다음 경우 (엔티티! = null) {
Nsumecontent ();
}
}
//URL 을 방문한 것으로 표시합니다.
Markurlasvisited (URL);
Strbuf.tostring () 을 반환합니다
}
Public static boolean is content relevant (문자열 내용,
모드 regexpPattern) {
부울 반환 값 = false;
만약 (내용! = null) {
//정규식의 조건을 충족합니까?
Matcher m = regexppattern.matcher (content.tolowercase ());
Retvalue = m.find ();
}
RetValue 를 반환합니다
}
공용 목록 추출 Url (문자열 텍스트, CrawlerUrl crawlerUrl) {
맵 urlmap = newhashmap ();
Extrachttpurls(URL map, text);
Extractreativeurls(URL map, text, crawler URL);
새 ArrayList (urlmap.keyset ()) 를 반환합니다.
}
개인 void extractHttpUrls (맵 urlMap, 문자열 텍스트) {
Matcher m = (텍스트);
While (m.find()) {
String URL = m.group ();
String [] terms = url.split ("a href = \");
For (문자열 용어: 용어) {
//system.out.println ("term ="+term);
If (term.startsWith("http")) {
Intindex = term.indexof ("\");
If (인덱스 > 0) {
Term = term.substring(0, 색인);
}
UrlMap.put(term, term);
System.out.println ("하이퍼링크:"+term);
}
}
}
}
Private void extractRelativeUrls (매핑 urlMap, 문자열 텍스트,
파충류 {
Matcher m = relativeregexp.matcher (텍스트);
Urltext URL = crawler url.geturl ();
Stringhost = text url.gethost ();
While (m.find()) {
String URL = m.group ();
String [] terms = url.split ("a href = \");
For (문자열 용어: 용어) {
If(term. starts with("/"){
Intindex = term.indexof ("\");
If (인덱스 > 0) {
Term = term.substring(0, 색인);
}
문자열 s =//+ 호스트+용어;
UrlMap.put(s, s);
System.out.println ("상대 URL:"+s);
}
}
}
}
공용 정적 void main(String[] args) {
시도 {
문자열 URL =
Queue URL queue = new linkedlist ();
String regexp = "Java
UrlQueue.add(new CrawlerUrl(url, 0));
Naive crawler crawler = new naive crawler (URL queue,100,5, 1000L,
Regexp);
//boolean allow crawl = crawler.areweallowedtovisit (URL);
// System.out.println ("크롤링 허용:"+URL+""+
//allowcrawl);
Crawler. 크롤링 ();
} catch (Throwable t) {
System.out.println (t.tostring ());
T.printstacktrace ();
}
}