您的位置:新闻资讯 >文章内容
如何构建代理IP池?使用Java构建免费代理IP池方法
来源:fengzhizi715 作者:admin 时间:2018-12-12 16:38:27

爬虫需要的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.附上完整的流程图

如何构建代理IP池?使用Java构建免费代理IP池方法


二、定时任务

每隔几个小时跑一次定时任务,在抓取完任务之后先删除旧的数据,然后再把新的数据插入到MongoDB中。

三、展示到前端

整个项目使用Spring Boot搭建,运行起来之后本地访问地址。

预览效果如下:

如何构建代理IP池?使用Java构建免费代理IP池方法

在使用前,还可以再做一次检测,只要双击某个代理IP即可。

如何构建代理IP池?使用Java构建免费代理IP池方法

检测某个代理.jpeg

在第二次检测时,对于已经失效的IP会被ProxyPool删除。

如何构建代理IP池?上文介绍了爬去免费IP建IP池,其实在做爬虫时,自己维护一个可用的代理IP池是很有必要的事情,如果是企业或者是想追求更高稳定性的IP池,即使不选用服务器构建,也可以购买代理IP构建IP池的。


相关文章内容简介
在线咨询
微信公众号

微信公众号

回到顶部