【发布时间】:2014-08-20 23:43:33
【问题描述】:
我正在使用 groovy 和 grails 开发 crawler4j。
我在 src/groovy 中有一个 BasicCrawler.groovy 类和域类 Crawler.groovy 和一个名为 CrawlerController.groovy 的控制器。
BasicCrawler.groovy 类中的属性很少,例如 url、parentUrl、domain 等。 p>
我想通过在爬行时将这些值传递给域类来将这些值保存到数据库中。
我尝试在 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 作为后端。
【问题讨论】:
-
您可以在各个代码位置临时添加一些
log.debug()或println,看看代码在哪里有效,哪里无效。 -
您能否在您的第一种方法中发布异常的行号。您尝试的第二种方法的实现有点错误,即在创建 BasicCrawler 的新实例时立即绑定参数,因此 url && parentUrl 将始终为空。因此,在您的 visit 方法执行后将其更改为绑定。
标签: grails groovy dns setting crawler4j