私はgroovyとgrailsを使ってcrawler4jに取り組んでいます。
src/groovyにBasicCrawler.groovyクラスがあり、ドメイン クラスCrawler.groovyとCrawlerController.groovyというコントローラーがあります。
BasicCrawler.groovyクラスには、url、parentUrl、domainなどのプロパティがほとんどありません。
クロール中にこれらの値をドメイン クラスに渡すことで、これらの値をデータベースに保持したいと考えています。
src/groovy の下のBasicCrawlerクラスでこれを試しました
class BasicCrawler extends WebCrawler {
Crawler obj = new Crawler()
//crawling code
@Override
void visit(Page page) {
//crawling code
obj.url = page.getWebURL().getURL()
obj.parentUrl = page.getWebURL().getParentUrl()
}
@Override
protected void handlePageStatusCode(WebURL webUrl, int statusCode, String statusDescription) {
//crawling code
obj.httpstatus = "not found"
}
}
私のドメインクラスは次のとおりです。
class Crawler extends BasicCrawler {
String url
String parentUrl
String httpstatus
static constraints = {}
}
しかし、次のエラーが発生しました。
ERROR crawler.WebCrawler - Exception while running the visit method. Message: 'No such property: url for class: mypackage.BasicCrawler
Possible solutions: obj' at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
この後、私は別のアプローチを試みました。私の src/groovy/BasicCrawler.groovy クラスでは、最初にurlプロパティとparentUrlプロパティを宣言してから、データバインディングを使用しました (初心者なので間違っているかもしれません)。
class BasicCrawler extends WebCrawler {
String url
String parentUrl
@Override
boolean shouldVisit(WebURL url) { //code
}
@Override
void visit(Page page) { //code
}
@Override
protected void handlePageStatusCode(WebURL webUrl, int statusCode, String statusDescription) {
//code}
}
def bindingMap = [url: url , parentUrl: parentUrl]
def Crawler = new Crawler(bindingMap)
}
私のCrawler.groovyドメインクラスは次のとおりです。
class Crawler {
String url
String parentUrl
static constraints = {}
}
現在、エラーは表示されていませんが、値はデータベースに保持されていません。バックエンドにはmongodbを使用しています。