这里涉及到的使用场景是将文件简历上传到识别网站的时候,频率过于频繁就会被封,所以添加了代理。所以这里的代理仅限于上传文件类型使用代理,如果是使用代理访问网页,可以查看其他文章或者评论留下问题,我发对应链接。
代理平台选择测试过大概十几个平台,部分情况汇总如下
阿布云只有一种隧道代理,没有按量购买的,请求量小的不建议使用;价格不算低的,少量使用不建议,量大的话可以考虑。 可取的:质量还行,曾使用阿布云获取过某网站的数据,无论响应时间还是稳定性上都还可以,截图证明使用情况。
质量非常一般;客服就是个垃圾,永远不会好好回复你消息;任意修改你订单的有效期,造成明明买了两年的IP,才过半年就不让你用了,还投诉无门。 可取的:价格便宜,也就这一个了,再便宜也是交学费。
有些网站挂上这个代理响应会特别慢,不挂代理就嗖嗖的。 可取的:类型比较多,按量和按月都有;客服答复比较积极,虽然也不怎么解决问题。 目前还剩下二十万次左右的没用,有需要的可以联系。
截至当日,蘑菇代理已经不再提供购买业务。官网打开就提示:因本公司业务调整,现暂停购买和续费入口。原有订单我们将继续为您服务,如有问题请联系客服。抱歉! 可取的:都不让续费了,之前还能购买少量并发的,现在这个平台不行了。
有IP池被用光的情况,某年某月的某一天,公司的数据获取不到了,经过层层筛查,发现是挂上这个代理以后不行,换其他家的就可以。联系客服说是他们的大客户把代理IP都给用光了,需要一周后补充IP池,让耐心等待。一不说替换方案,二不说补偿机制,就让干等着,所以就换了。 可取的:代理种类够用,性价比不错。适合作为备选。 下图是某一天的代理IP使用情况。
其他家的不管是开测试账号还是购买了部分功能,使用起来都不是特别顺,不再推荐了。
代理上传文件httpclient版本使用的是4.5.13,因为引入的阿里云的包包括了这个,所以没有重复写。比如引入httpmime。 pom文件引入:
org.springframework.boot
spring-boot-starter-mail
com.aliyun
aliyun-java-sdk-core
4.4.0
com.aliyun.oss
aliyun-sdk-oss
3.10.2
com.alibaba
fastjson
1.2.60
org.jsoup
jsoup
1.12.1
org.apache.httpcomponents
httpmime
org.apache.commons
commons-lang3
全局设置如下,处理https请求忽略认证的问题。
private static final String HTTP = "http";
private static final String HTTPS = "https";
private static SSLConnectionSocketFactory sslsf = null;
private static PoolingHttpClientConnectionManager cm = null;
private static SSLContextBuilder builder = null;
static {
System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");
try {
builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
return true;
}
});
sslsf = new SSLConnectionSocketFactory(builder.build(),
new String[] { "SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.2" }, null, NoopHostnameVerifier.INSTANCE);
Registry registry = RegistryBuilder.create()
.register(HTTP, new PlainConnectionSocketFactory()).register(HTTPS, sslsf).build();
cm = new PoolingHttpClientConnectionManager(registry);
cm.setMaxTotal(200);
} catch (Exception e) {
e.printStackTrace();
}
}
下面的这个代码就是如何使用代理IP代理了,挂上代理后发送文件请求。
- 代理设置了账号和密码,不需要设置的自行去掉
- 有获取代理IP的代码,如果是隧道代理可绕过此步
try {
CookieStore store = new BasicCookieStore();
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("代理账号", "代理密码"));
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).setConnectionManager(cm)
.setConnectionManagerShared(true).setDefaultCookieStore(store)
.setDefaultCredentialsProvider(credsProvider).build();
String url = Jsoup.connect("https://获取代理IP链接/allocate?Key=代理账号").ignoreContentType(true)
.method(Method.GET).execute().body();
JSONObject json = JSON.parseObject(url);
JSONObject obj = json.getJSONArray("Data").getJSONObject(0);
String ip = obj.getString("IP");
int port = obj.getIntValue("port");
System.out.println(Dates.now() + "代理IP " + ip + ":" + port);
HttpHost myProxy = new HttpHost(ip, port);
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(30000).setConnectTimeout(30000).setProxy(myProxy).build(); //一定要设置超时时间,不然等一天也不返回
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("resume-file", is, ContentType.APPLICATION_OCTET_STREAM, fileName); // is是inputstream输入流,fileName是上传的文件名称
HttpEntity multipart = builder.build();
HttpPost post = new HttpPost("上传的接口地址");
post.setConfig(requestConfig);
post.setEntity(multipart);
System.out.println(Dates.now() + "文件解析开始上传了");
CloseableHttpResponse response = httpclient.execute(post);
System.out.println(Dates.now() + "上传完成了");
byte[] bResultXml = EntityUtils.toByteArray(response.getEntity());
String result = new String(bResultXml, "utf-8");
return result;
} catch(Exception e) {
e.printStackTrace();
}