我想将参数传递给crawler4j中的()方法。我在GitHub上看到了使用工厂方式的文档库页面的示例,但我无法理解。请有人提供一个示例示例来实现
变体1:将其他参数注入构造函数参数
除了shouldVisit(...)
的方法参数以外,还需要以构造函数参数传递到每个WebCrawler
类中。
这意味着,您可以使用factory
类:
MyWebCrawler.class
带有两个自定义参数(customArgument1
和customArgument2
):
public class MyWebCrawler extends WebCrawler {
private final String customArgument1;
private final String customArgument2;
public MyWebCrawler(String customArgument1, String customArgument2) {
this.customArgument1 = customArgument1;
this.customArgument2 = customArgument2;
}
@Override
public boolean shouldVisit(Page referringPage, WebURL url) {
String href = url.getURL().toLowerCase();
return customArgument1.equals(href) || customArgument2.equals(href);;
}
@Override
public void visit(Page page) {
//do something
}
}
为此,factory
应该是这样的:
public class MyCrawlerFactory implements CrawlController.WebCrawlerFactory<MyWebCrawler> {
public MyCrawlerFactory newInstance() throws Exception {
return new MyCrawlerFactory("some argument", "some other argument");
}
}
每次创建MyWebCrawler
的新实例时,您都可以传递自定义参数。
要使用工厂,您将从CrawlController
开始爬行过程:
controller.start(new MyCrawlerFactory(), numberOfCrawlers);
可以在官方GitHub存储库中找到类似的工作示例。
变体2:使用CrawlController#getCustomData()
(已弃用)
您可以在CrawlController
对象上使用customData
将其他数据注入Web-Crawler对象。但是,这是弃用的方式,可以在crawler4j
的将来发行中删除。