URL фида RSS возвращает HTML при получении через прокси - PullRequest
0 голосов
/ 19 февраля 2019

Craigslist имеет RSS-URL, который возвращает результаты XML для поиска.Я могу запустить следующий фрагмент Python и, как и ожидалось, он возвращает XML-ленту RSS:

import requests
url = "https://denver.craigslist.org/search/msg?auto_make_model=gibson+sg&format=rss"
result = requests.get(url)

Я хотел бы сделать запросы страниц через прокси из Java-программы.Я подписался на сервис Crawlera и создал класс Java на основе примера кода в документации Crawlera:

import java.io.File;
import java.net.URL;
import javax.net.ssl.SSLContext;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;


public class ProxyUrlRequester {

    public String getUrl(URL url, String crawleraApiKey) throws Exception {

        // Trust own CA and all self-signed certs
        SSLContext sslcontext = SSLContexts.custom()
                .loadTrustMaterial(new File("/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Contents/Home/jre/lib/security/cacerts"),
                        "changeit".toCharArray(),
                        new TrustSelfSignedStrategy())
                .build();

        // Allow TLSv1 protocol only
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslcontext, new String[] {"TLSv1"},
                null,
                SSLConnectionSocketFactory.getDefaultHostnameVerifier());

        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(
                new AuthScope("proxy.crawlera.com", 8010),
                new UsernamePasswordCredentials(crawleraApiKey, ""));

        try (CloseableHttpClient httpclient = HttpClients.custom()
                .setDefaultCredentialsProvider(credsProvider)
                .setSSLSocketFactory(sslsf)
                .build())
        {

            HttpHost target = new HttpHost(url.getHost(), 443, "https");
            HttpHost proxy = new HttpHost("proxy.crawlera.com", 8010);

            AuthCache authCache = new BasicAuthCache();

            BasicScheme basicAuth = new BasicScheme();
            basicAuth.processChallenge(
                    new BasicHeader(HttpHeaders.PROXY_AUTHENTICATE,
                            "Basic realm=\"Crawlera\""));
            authCache.put(proxy, basicAuth);

            HttpClientContext ctx = HttpClientContext.create();
            ctx.setAuthCache(authCache);

            RequestConfig config = RequestConfig.custom()
                    .setProxy(proxy)
                    .build();

            HttpGet httpget = new HttpGet(url.getPath());
            httpget.setConfig(config);

            String content;
            try (CloseableHttpResponse response = httpclient.execute(
                    target, httpget, ctx))
            {
                content = EntityUtils.toString(response.getEntity());
                EntityUtils.consume(response.getEntity());
            }

            return content;

        }
    }
}

По какой-то причине этот класс получает HTMLрезультаты (то есть не XML) для страницы Craigslist и, похоже, игнорируют строку поиска.Я протестировал этот класс с несколькими случайными страницами с других сайтов, и он работал просто отлично.

Кто-нибудь знает, почему я не могу получить данные из RSS-канала Craigslist через прокси-сервер Crawlera?

...