기존 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");
}
}
}
감사합니다. 훌륭하게 작동합니다. 이 답변은 완벽합니다! – baltazar123
@ baltazar123 도와 줘서 기쁩니다. – ditkin