我正在使用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作为后端。
答案 0 :(得分: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来“重新获取”#39;并更新原始网站'访问了'因为我假设这将是每一行的唯一约束。