我正在使用 crawler4j 开发一个 grails 应用程序。
我知道这是一个老问题,我在这里遇到了这个解决方案。
我尝试了提供的解决方案,但不确定将另一个 fetcher 和 mockssl java 文件保存在哪里。
另外,我不确定在包含 https://... 的 url 的情况下如何调用这两个类
提前致谢。
我正在使用 crawler4j 开发一个 grails 应用程序。
我知道这是一个老问题,我在这里遇到了这个解决方案。
我尝试了提供的解决方案,但不确定将另一个 fetcher 和 mockssl java 文件保存在哪里。
另外,我不确定在包含 https://... 的 url 的情况下如何调用这两个类
提前致谢。
解决方案工作正常。也许你有一些问题来推断将代码放在哪里。这是我的使用方法:
创建爬虫时,您的主类中将有类似的内容,如官方文档所示:
public class Controller {
public static void main(String[] args) throws Exception {
CrawlConfig config = new CrawlConfig();
config.setCrawlStorageFolder(crawlStorageFolder);
/*
* Instantiate the controller for this crawl.
*/
PageFetcher pageFetcher = new MockSSLSocketFactory(config);
RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
....
在这里,您使用 MockSSLSocketFactory 定义如您发布的链接中所示:
public class MockSSLSocketFactory extends PageFetcher {
public MockSSLSocketFactory (CrawlConfig config) {
super(config);
if (config.isIncludeHttpsPages()) {
try {
httpClient.getConnectionManager().getSchemeRegistry().unregister("https");
httpClient.getConnectionManager().getSchemeRegistry()
.register(new Scheme("https", 443, new SimpleSSLSocketFactory()));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
如您所见,这里使用的是 SimpleSSLSocketFactory 类。这可以定义为链接示例中所示:
public class SimpleSSLSocketFactory extends SSLSocketFactory {
public SimpleSSLSocketFactory() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException,
UnrecoverableKeyException {
super(trustStrategy, hostnameVerifier);
}
private static final X509HostnameVerifier hostnameVerifier = new X509HostnameVerifier() {
@Override
public void verify(String host, SSLSocket ssl) throws IOException {
// Do nothing
}
@Override
public void verify(String host, String[] cns, String[] subjectAlts) throws SSLException {
// Do nothing
}
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
@Override
public void verify(String arg0, java.security.cert.X509Certificate arg1) throws SSLException {
// TODO Auto-generated method stub
}
};
private static final TrustStrategy trustStrategy = new TrustStrategy() {
@Override
public boolean isTrusted(java.security.cert.X509Certificate[] arg0, String arg1) throws CertificateException {
return true;
}
};
}
如您所见,我只是从官方文档和您发布的链接中复制代码,但我希望将所有内容放在一起对您来说会更清楚。