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?