我正在使用groovy和grails开发crawler4j。
我有一个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的后端。
我认为这个例子有点做作,但这里有一种方法可以在当前情况下解决这个问题:
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来'重新获取'和更新原始网站'访问',因为我假设这将是对每一行的唯一约束。