3

私はgroovyとgrailsを使ってcrawler4jに取り組んでいます。

src/groovyにBasicCrawler.groovyクラスがあり、ドメイン クラスCrawler.groovyとCrawlerController.groovyというコントローラーがあります。

BasicCrawler.groovyクラスには、urlparentUrldomainなどのプロパティがほとんどありません。

クロール中にこれらの値をドメイン クラスに渡すことで、これらの値をデータベースに保持したいと考えています。

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を使用しています。

4

1 に答える 1