开源 & 免费代理工具 IPProxyTool

2017-07-12

开源 & 免费代理工具 IPProxyTool

使用 scrapy 爬虫抓取代理网站,获取大量的免费代理 ip。循环过滤出所有可用的 ip,存入数据库以供其他项目使用
我目前开发的很多爬虫项目都用到了这个代理工具,稳定高效抓取大量数据必备神器。

项目来源

目前很多主流网站都有反爬策略,最主要的策略就是检测同一 IP 在单位时间内的访问次数,如果访问次数超过一定阀值,则限制该 IP 的访问或者弹出验证码窗口。然而爬虫最大的特点就是快速的访问同一站点,从该站点提取需要的信息。所以如果使用单一的 IP 访问目标站点,很快就会触发网站的反爬策略。市场上也有一些收费的代理服务,而且很多服务都是按照时间收费的,个人业余项目需要不断尝试,所以购买代理 IP 服务会有一些限制。而且目前有很多的免费代理网站提供一些免费的代理 IP,这些 IP 大部分都是不可用的,只有少部分可用。虽然只有少部分可用,但是还是可以积少成多。只需要从免费代理网站抓取代理 ip,并且检测代理 ip 的有效性,将检测有效的 ip 存入数据库,以备后续使用。所以就有了这个项目,目前能够满足我个人的代理需求。

项目依赖

安装命令:

$ pip install Scrapy BeautifulSoup requests pymysql web.py scrapydo lxml

克隆使用

将项目克隆到本地

$ git clone https://github.com/awolfly9/IPProxyTool.git

进入工程目录

$ cd IPProxyTool

修改 mysql 数据库配置 config.py 中 database_config 的用户名和密码为数据库的用户名和密码

$ vim config.py
-------------------
database_config = {
    'host': 'localhost',
    'port': 3306,
    'user': 'root',
    'password': '123456',
}

运行启动脚本 ipproxytool.py。 也可以分别运行抓取,验证,服务器接口脚本,运行方法参考项目说明

$ python ipproxytool.py

项目说明

抓取代理网站

所有抓取代理网站的代码都在 proxy

扩展抓取其他的代理网站

1.在 proxy 目录下新建脚本并继承自 BaseSpider
2.设置 name、urls、headers
3.重写 parse_page 方法,提取代理数据
4.将数据存入数据库 可以参考 ip181.py kuaidaili.py
5.如果需要抓取特别复杂的代理网站,可以参考 peuland.py

修改 runspider.py 导入抓取库,添加到抓取队列

运行 runspider.py 脚本开始抓取代理网站

$ python runspider.py

验证代理 ip 是否有效

1.从上一步抓取并存储的数据库中取出所有的代理 IP
2.利用取出的代理 IP 去请求 http://httpbin.org/get?show_env=1
3.根据请求结果判断出代理 IP 的有效性,是否支持 HTTPS 以及匿名度,
  并存储到表 httpbin 中
4.从 httpbin 表中取出代理去访问目标网站,例如 豆瓣网
5.如果请求在合适的时间返回成功的数据,则认为这个代理 IP 有效

一个目标网站对应一个脚本,所有验证代理 ip 的代码都在 validator

扩展验证其他网站

1.在 validator 目录下新建脚本并继承 Validator
2.设置 name、timeout、urls、headers
3.然后调用 init 方法,可以参考 baidu.py douban.py
4.如果需要特别复杂的验证方式,可以参考 assetstore.py

修改 runvalidator.py 导入验证库,添加到验证队列

运行 runvalidator.py 脚本验证代理 ip

$ python runvalidator.py

获取代理 ip 数据服务器接口

在 config.py 中修改启动服务器端口配置 data_port,默认为 8000 启动服务器

$ python runserver.py

服务器提供接口

获取

http://127.0.0.1:8000/select?name=douban&anonymity=1& https=yes&sort=speed&count=100

参数

Name Type Description must
name str 数据库名称
anonymity int 1:高匿 2:匿名 3:透明
https str https:yes http:no
order str table 字段
sort str asc 升序,desc 降序
count int 获取代理数量,默认 100

删除

http://127.0.0.1:8000/delete?name=free_ipproxy&ip=27.197.144.181

参数

Name Type Description 是否必须
name str 数据库名称
ip str 需要删除的 ip

插入

http://127.0.0.1:8000/insert?name=douban&ip=555.22.22.55& port=335&country=china&anonymity=1& https=yes&speed=5&source=100

参数

Name Type Description 是否必须
name str 数据库名称
ip str ip 地址
port str 端口
country str 国家
anonymity int 1:高匿,2:匿名,3:透明
https str yes:https,no:http
speed float 访问速度
source str ip 来源

参考

源码

完整源码请戳 github