![b514020c-a416-eb11-8da9-e4434bdf6706.png](http://p03.5ceimg.com/content/b514020c-a416-eb11-8da9-e4434bdf6706.png)
还记得刚学爬虫的时候,选了一个美女网站来练手,效率极高,看到什么都想爬下来。爬得正高兴呢,出现了一连串错误信息,查看后发现因为爬取太过频繁,被网站封了ip,那时起就有了构建代理ip池的念头。
网上搜索一下代理ip就会发现有很多网站提供,但是稳定好用的都要收费,免费倒也有一堆,但大多数都不能用。而且我写的一般都是小爬虫,极少有爬取上白g数据的时候,用收费的代理ip有点浪费。
所以,写了这个代理ip池,从各大代理ip网站爬取收集免费的代理ip,然后一一进行测试,从中筛选出高速可用的ip。得益于Node的异步架构,速度非常快,可以直接在自己的爬虫里调用,每次爬取前获取最新的代理ip,以后妈妈就再也不用担心我的爬虫被封了。
接下来会分为三个部分来讲解,怎么下载,怎么用和怎么写,如果只是想用的话看前两篇就够了。
1.如何下载
有两种途径,一个是通过Github:Card007/Proxy-Pool;
另一种是通过npm添加:npm install ip-proxy-pool;
两种方式都可以,推荐github,有个使用说明,后期我还会进行更新,欢迎start。
2.如何使用
//导入本地模块
3.怎么手动写一个代理ip池
现在来说说自己怎么写一个代理ip池,以西刺为例,用到的工具和方法基本上和上一篇爬取豆瓣top250一样,先是爬取西刺网站前5页的所有免费ip,然后保存在sqlite数据库里,接着通过每一个代理ip来访问某个网址,返回200则是可用,返回其它数字的则删除,来看代码:
//导入相应的库
接下来就碰到了Node的一个大坑,异步。由于异步架构,需要用到Promise来控制,比如在这个代理ip池里,会出现reqeust函数还没有爬完的时候就开始执行验证函数,直接导致错误。
所以我们这里需要分为两组,一组为异步爬取网站信息,另一组为异步验证代理ip,现在来改造一下上面的代码:
//生成网址
接下来分析一下网页内容,这里我们只需要ip,端口,和类型即可:
//分析网页内容
接着来实现数据库的存储删除功能:
//打开数据库
接着将数据库里的ip提取出来,进行测速筛选:
//从数据库提取出来的ip会通过这个类创建一个对象
最后,来写几个运行函数:
var
大功告成:
![b614020c-a416-eb11-8da9-e4434bdf6706.png](http://p01.5ceimg.com/content/b614020c-a416-eb11-8da9-e4434bdf6706.png)
完整代码可以通过github查看:GitHub
也可以访问我的网站,获取更多文章:Nothlu.com