一个可用的免费国外代理IP爬取笔记

码云
2020-12-11 10:47

最近项目需要采集IP用来做相关的数据爬虫服务,前期已经调研了阿布云、快代理等商用平台,觉得挺不错的,可惜等到真正要用的时候才发现,这些平台大部分听的都是国内的代理ip。由于项目刚开始并不需要大量的代理ip,只需要有限的几个进行校验和前期测试,因此就想通过免费代理的网站找到一些还不错的免费代理ip网站进行定时采集ip,并提供接口给内部使用和调试。

经过一番吐槽和纠结(在此省略1000字鄙视下某github开元项目,java的,号称95%高可用,实际验证下来基本上不能用)。one thousand leter……大概研究了十来个免费代理ip网站(最终还是在墙哥哥指导下找到的),决定前期先使用free-proxy这个网站作为采集源。由于鄙人主要做java开发,因此提供的相关采集代码片段均以java为主。其他语言使用者可以类似的参考下。
废话不多说,直接上手代码:

分析网站url构造发现采集源均为此格式:

                add("http://free-proxy.cz/zh/proxylist/country/US/all/ping/all/1");
                add("http://free-proxy.cz/zh/proxylist/country/US/all/ping/all/2");
                add("http://free-proxy.cz/zh/proxylist/country/US/all/ping/all/3");
                add("http://free-proxy.cz/zh/proxylist/country/US/all/ping/all/4");
                add("http://free-proxy.cz/zh/proxylist/country/US/all/ping/all/5");

匹配正则路径如下

"http://free-proxy.cz/zh/proxylist/country/US/all/ping/all/\\d"

关键采集代码:

Elements elements = page.getHtml().getDocument().getElementById("proxy_list").getElementsByTag("tr");
		Element element;
		 List<ProxyIp> ipList = new ArrayList<ProxyIp>();
		 for (int i = 1; i < elements.size() - 1; i++) {
	            try {
	            	ProxyIp proxyIp = new ProxyIp();
	            	element = elements.get(i);
	            	String ipStr = element.child(0).html();
	            	int first = ipStr.indexOf("Base64.decode(\"");
	        		int last = ipStr.lastIndexOf("\"))");
	        		String aa = ipStr.substring(first+15, last);
	        		byte[] bytes = Base64.getDecoder().decode(aa);
	            	String ip=new String(bytes);
	                String ipPort =element.child(1).text();
	                String prototype = element.child(2).text();
	                String country = element.child(3).text();
	                proxyIp.setOther(element.child(6).text());//是否匿名
	                proxyIp.setIp(ip);
	                proxyIp.setPort(Integer.parseInt(ipPort));
	                proxyIp.setAddr(country);
	                proxyIp.setType(prototype.toUpperCase());
	                if(CheckIPUtil.checkValidIP(ip,proxyIp.getPort(),prototype)) {
	                	proxyIp.setUsed(true);
	                	proxyIp.setCreateTime(new Date());
		                ipList.add(proxyIp);
	                }else {
	                	continue;
	                }
	            } catch (Exception e) {
	            	logger.error("myProxyCrawlerJob error:{0}",e);
	            }
	        }
page.putField("ipList", ipList);

采集后形成ipList列表,并做好相关存储就行。

值得一提的是在采集ip地址的过程中,free-proxy网站对ip进行了动态js base64加密,因此需要再抓取后,对js代码进行裁剪,并进行base64解密操作。由于只是简单测试,只需要简单进行裁剪即可采集到,关键代码如下:

                    int first = ipStr.indexOf("Base64.decode(\"");
	        		int last = ipStr.lastIndexOf("\"))");
	        		String aa = ipStr.substring(first+15, last);
	        		byte[] bytes = Base64.getDecoder().decode(aa);
	            	String ip=new String(bytes);

搞定,就可以完整采集到ip了。

 

free-proxy提供了http,https、sock4三种方式的ip可以采集,下来后,一个页面可以抓取到7个可用IP左右。

全部评论

相关文章