2011-05-08 5 views
0

Niocchi 라이브러리 사용 경험이 있습니까? 도메인 URL로 크롤링하기 시작합니다. Worker method processResource()에서 내가 얻은 리소스를 파싱하고이 페이지의 모든 내부 링크를 추출하고 크롤링에 추가해야합니다. 그러나 나는 어떻게 찾을 수 없다. UrlPool, ResourcePool 또는 다른 곳에 추가해야합니까?Niocchi Crawler - 크롤링 과정에서 크롤링 할 URL을 추가하는 방법 (전체 웹 사이트 크롤링)

감사합니다.

답변

3

기존 URLPool에 추가 할 수 있습니다. 기존의 URLPool 구현은 확장 할 수 없으므로 확장 가능한 자체 URLPool 클래스를 만들어야합니다. 내 수업은 ExpandableURLPool이라고했습니다.

URLPool.setProcessed 메서드는 처리가 완료되면 프레임 워크에서 호출되며 URL 목록에 추가 URL을 추가 할 수 있습니다. 나는 예제를 따라하지만 먼저 URLPool 문서 상태 : 쿼리가 크롤링하고 그 자원을 처리 할 때

이 setProcessed (쿼리)를 URLPool을 알려 크롤러에 의해 호출됩니다. 이것은 일반적으로 URLPool에서 크롤링 상태를 확인하고 실패 할 경우 오류를 기록하거나 성공할 경우 더 많은 URL을 크롤링하기 위해 사용됩니다. getNextQuery()가 null을 반환하지만 hasNextQuery()가 true를 반환하는 일반적인 예는 URLPool이 크롤링 할 URL이 더 많이 추출 된 일부 처리 된 리소스를 기다리는 경우입니다. 구현 예제는 urlpools 패키지를 확인하십시오.

은 ExapndableURLPool의 구현에 까다로운 부분이 새로운 URL이 풀에 추가 될 수 있음을 처리하는 뛰어난 쿼리가있는 경우 hasNextQuery 메소드가 true를 반환해야한다는 것을 의미한다. 마찬가지로 getNextQuery는 미완료 쿼리가 아직 완료되지 않은 경우 null을 반환해야하며 새 URL이 풀에 추가 될 수 있습니다.

class ExpandableURLPool implements URLPool { 
List<String> urlList = new ArrayList<String>(); 
int cursor = 0; 

int outstandingQueryies = 0; 

public ExpandableURLPool(Collection<String> seedURLS) { 
    urlList.addAll(seedURLS); 
} 

@Override 
public boolean hasNextQuery() { 
    return cursor < urlList.size() || outstandingQueryies > 0; 

} 

@Override 
public Query getNextQuery() throws URLPoolException { 
    try { 
     if (cursor >= urlList.size()) { 
      return null; 
     } else { 
      outstandingQueryies++; 
      return new Query(urlList.get(cursor++)) ; 
     } 
    } catch (MalformedURLException e) { 
     throw new URLPoolException("invalid url", e) ; 
    }  
} 

@Override 
public void setProcessed(Query query) { 
    outstandingQueryies--; 


} 

public void addURL(String url) { 
    urlList.add(url); 
} 

} 

가 나는 또한 위의 구현을 테스트하는 DiskSaveWorker에서 파생 된 노동자 클래스를 생성 :

여기

이 ExpandableURLPool의 내 매우 예비 버전 [나는 niocchi이 점에서 조립하는 방식을 싫어한다]

class MyWorker extends org.niocchi.gc.DiskSaveWorker { 

    Crawler mCrawler = null; 
    ExpandableURLPool pool = null; 

    int maxepansion = 10; 

    public MyWorker(Crawler crawler, String savePath, ExpandableURLPool aPool) { 
     super(crawler, savePath); 
     mCrawler = crawler; 
     pool = aPool; 
    } 

    @Override 
    public void processResource(Query query) { 
     super.processResource(query); 
     // The following is a test 
     if (--maxepansion >= 0 ) { 
      pool.addURL("http://www.somewhere.com"); 
     }  

    } 


} 
+0

감사합니다. 훌륭하게 작동합니다. 이 답변은 완벽합니다! – baltazar123

+0

@ baltazar123 도와 줘서 기쁩니다. – ditkin