Я работаю над crawler4j, используя groovy и grails.Задайте значения из классов src/groovy для свойств класса домена
У меня есть BasicCrawler.groovy класса в И/заводных и класс домена Crawler.groovy и контроллер под названием CrawlerController.groovy.
У меня есть несколько свойств в BasicCrawler.groovy класс как URL, parentUrl, домен т.д.
Я хочу, чтобы эти значения сохраняются в базе данных, передавая эти значения в классе домена в то время как сканирование происходит.
Я пытался делать это в моем BasicCrawler класса под SRC/заводной
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/заводной/класс 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' в различные места кода и посмотреть, где работает код, а где нет. – wwarlock
Не могли бы вы указать номер строки исключения для вашего первого подхода. Второй подход, который вы попробовали, имеет немного неправильную реализацию, т. Е. Вы сразу связываете параметры, когда создается новый экземпляр ** BasicCrawler **, поэтому значения ** url ** && ** parentUrl ** всегда будут равны нулю. Поэтому измените его на привязку после выполнения ** ** ** метода. –