您当前的位置: 首页 >  Java

lootaa

暂无认证

  • 0浏览

    0关注

    68博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java如何使用IP代理

lootaa 发布时间:2022-04-17 15:46:10 ,浏览量:0

前述

这里涉及到的使用场景是将文件简历上传到识别网站的时候,频率过于频繁就会被封,所以添加了代理。所以这里的代理仅限于上传文件类型使用代理,如果是使用代理访问网页,可以查看其他文章或者评论留下问题,我发对应链接。

代理平台选择

测试过大概十几个平台,部分情况汇总如下

阿布云

只有一种隧道代理,没有按量购买的,请求量小的不建议使用;价格不算低的,少量使用不建议,量大的话可以考虑。 可取的:质量还行,曾使用阿布云获取过某网站的数据,无论响应时间还是稳定性上都还可以,截图证明使用情况。

在这里插入图片描述

讯代理

质量非常一般;客服就是个垃圾,永远不会好好回复你消息;任意修改你订单的有效期,造成明明买了两年的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代理了,挂上代理后发送文件请求。

  1. 代理设置了账号和密码,不需要设置的自行去掉
  2. 有获取代理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();
		}
关注
打赏
1663829960
查看更多评论
立即登录/注册

微信扫码登录

0.0409s