800819103
在线客服,实时响应qq群
在线客服,实时响应客服电话
13318873961爬虫需要的IP量比较大,特别是爬去大量的数据,而且有一些网站的反爬虫机制比较严格,或许需要更优质的IP,这时候可以尝试构建代理IP池,那么如何构建代理IP池?
代理IP池的构建并不难,难得是控制IP的质量与数量。通过IP是从免费的网站上获取,这类IP质量低,可用率低;或者通过购买代理IP,质量跟数量都可以控制,缺点就是花钱;又或者通过搭建服务器,IP稳定、质量高,问题是成本过高。
本文的代理IP池是通过爬虫事先从多个免费网站上获取代理IP之后,再做检查判断IP是否可用,可用的话就存放到MongoDB中,最后展示到前端的页面上。
一、获取可用Proxy
获取代理的核心代码是ProxyManager,它采用RxJava2来实现,主要做了以下几件事:
1.创建ParallelFlowable,针对每一个提供免费代理IP的页面并行地抓取。
Flowable.fromIterable(ProxyPool.proxyMap.keySet()) .parallel()
2.针对每一个页面进行抓取,返回List
map(new Function<String, List>() { @Override public List apply(String s) throws Exception { try { return new ProxyPageCallable(s).call(); } catch (Exception e) { e.printStackTrace(); } return null; } })
3.对每一个页面获取的代理IP列表进行校验,判断是否可用
flatMap(new Function<List, Publisher>() { @Override public Publisher apply(List proxies) throws Exception { if (proxies == null) return null; List result = proxies .stream() .parallel() .filter(new Predicate() { @Override public boolean test(Proxy proxy) { HttpHost httpHost = new HttpHost(proxy.getIp(), proxy.getPort(), proxy.getType()); return HttpManager.get().checkProxy(httpHost); } }).collect(Collectors.toList()); return Flowable.fromIterable(result); } })
4.依次保存到proxyList
subscribe(new Consumer() { @Override public void accept(Proxy proxy) throws Exception { log.debug("Result Proxy = "+proxy.getType()+"://"+proxy.getIp()+":"+proxy.getPort()); proxy.setLastSuccessfulTime(new Date().getTime()); ProxyPool.proxyList.add(proxy); } });
5.附上完整的流程图
二、定时任务
每隔几个小时跑一次定时任务,在抓取完任务之后先删除旧的数据,然后再把新的数据插入到MongoDB中。
三、展示到前端
整个项目使用Spring Boot搭建,运行起来之后本地访问地址。
预览效果如下:
在使用前,还可以再做一次检测,只要双击某个代理IP即可。
检测某个代理.jpeg
在第二次检测时,对于已经失效的IP会被ProxyPool删除。
如何构建代理IP池?上文介绍了爬去免费IP建IP池,其实在做爬虫时,自己维护一个可用的代理IP池是很有必要的事情,如果是企业或者是想追求更高稳定性的IP池,即使不选用服务器构建,也可以购买代理IP构建IP池的。