Crawler4j не работает для URL-адресов https

Я разрабатываю приложение Grails, используя Crawler4j.

Я знаю, что это старый вопрос, и я нашел это решение здесь.

Я попробовал предложенное решение, но не уверен, где хранить другие файлы fetcher и mockssl java.

Кроме того, я не уверен, как эти два класса будут вызываться в случае URL-адресов, содержащих https://...

Заранее спасибо.


person clever_bassi    schedule 09.07.2014    source источник


Ответы (1)


Решения работают нормально. Возможно, у вас есть проблемы с выводом, куда поместить код. Вот как я его использую:

При создании сканера в вашем основном классе будет что-то подобное, как показано в официальной документации. :

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;
    }
};

}

Как видите, я только копирую код из официальной документации и ссылку, которую вы разместили, но я надеюсь, что вам будет понятнее увидеть все вместе.

person King Midas    schedule 13.08.2014
comment
где разместить эти классы? - person clever_bassi; 25.08.2014
comment
Эти классы должны быть в вашем собственном проекте. Контроллер будет вашим основным классом приложения, который будет выполняться при выполнении вашего приложения. Другой класс может находиться в любом месте вашего проекта, единственным ограничением является то, что он должен быть доступен контроллеру. Вы можете скопировать эти классы как есть в свой проект. - person King Midas; 26.08.2014