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 类中,我在顶部声明了urlparentUrl属性,然后使用了数据绑定(我可能是错的,因为我只是一个初学者):

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

0

我认为这个例子有点做作,但在当前情况下,您可以通过以下方式解决此问题:

class BasicCrawler extends WebCrawler {
   @Override
   void visit(Page page) {
      Crawler obj = new Crawler()
      obj.url = page.getWebURL().getURL()
      obj.parentUrl = page.getWebURL().getParentUrl()
      obj.save()
   }

   @Override
   protected void handlePageStatusCode(WebURL webUrl, int statusCode, String   statusDescription) {
      Crawler obj = Crawler.findByUrl(webUrl)
      obj.httpstatus = "not found"
      obj.save()
   }
}

这里的关键不是使用成员实例变量,而是使用 URL 来“重新获取”和更新“访问”的原始站点,因为我假设这将是每一行的唯一约束。

于 2014-10-26T19:45:12.390 回答