2014-06-30 3 views
3

Я работаю над 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 для бэкэнда.

+0

Вы можете временно добавить некоторые 'log.debug()' или 'println' в различные места кода и посмотреть, где работает код, а где нет. – wwarlock

+0

Не могли бы вы указать номер строки исключения для вашего первого подхода. Второй подход, который вы попробовали, имеет немного неправильную реализацию, т. Е. Вы сразу связываете параметры, когда создается новый экземпляр ** BasicCrawler **, поэтому значения ** url ** && ** parentUrl ** всегда будут равны нулю. Поэтому измените его на привязку после выполнения ** ** ** метода. –

ответ

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-адрес для «refetch» и обновлять исходный сайт «посетил», так как я предполагаю, что это будет уникальное ограничение для каждой строки.

Смежные вопросы