继上一篇之后,大家在 github, 我的公众号和博客上提出了很多建议。经过两周时间的努力,基本完成了开源 IP 代理池 IPProxyPool 的重构任务,业余时间基本上都花在上面了。
IPProxyPool 相对于之前的版本完成了哪些提升呢?主要包括一下几个方面:
大家如果感兴趣,可以到 github 上 clone ,已经 503 star 了。
下面说明一下使用方法:
1. 安装 sqlite 数据库 (一般系统内置): apt-get install sqlite3
2. 安装 requests,chardet,web.py,gevent: pip install requests chardet web.py sqlalchemy gevent
3. 安装 lxml: apt-get install python-lxml
注意:
1. 下载, 路径添加到环境变量
2. 安装 requests,chardet,web.py,gevent: pip install requests chardet web.py sqlalchemy gevent
3. 安装 lxml: pip install lxml 或者下载
注意:
本项目默认数据库是 sqlite,但是采用 sqlalchemy 的 ORM 模型,通过预留接口可以拓展使用 MySQL,MongoDB 等数据库。 配置方法:
1.MySQL 配置
- 第一步:首先安装MySQL数据库并启动第二步:安装MySQLdb或者pymysql(推荐)第三步:在config.py文件中配置DB_CONFIG。如果安装的是MySQLdb模块,配置如下:DB_CONFIG = {
- 'DB_CONNECT_TYPE': 'sqlalchemy',
- 'DB_CONNECT_STRING' = 'mysql+mysqldb://root:root@localhost/proxy?charset=utf8'
- }如果安装的是pymysql模块,配置如下:DB_CONFIG = {
- 'DB_CONNECT_TYPE': 'sqlalchemy',
- 'DB_CONNECT_STRING' = 'mysql+pymysql://root:root@localhost/proxy?charset=utf8'
- }
sqlalchemy 下的 DB_CONNECT_STRING 参考,理论上使用这种配置方式不只是适配 MySQL,sqlalchemy 支持的数据库都可以,但是仅仅测试过 MySQL。
2.MongoDB 配置
- 第一步:首先安装MongoDB数据库并启动第二步:安装pymongo模块第三步:在config.py文件中配置DB_CONFIG。配置类似如下:DB_CONFIG = {
- 'DB_CONNECT_TYPE': 'pymongo',
- 'DB_CONNECT_STRING' = 'mongodb://localhost:27017/'
- }
由于 sqlalchemy 并不支持 MongoDB, 因此额外添加了 pymongo 模式,DB_CONNECT_STRING 参考 pymongo 的连接字符串。
注意:如果大家想拓展其他数据库,可以直接继承 db 下 ISqlHelper 类,实现其中的方法,具体实现参考我的代码,然后在 DataStore 中导入类即可。
- try: if DB_CONFIG['DB_CONNECT_TYPE'] == 'pymongo': from db.MongoHelper import MongoHelper as SqlHelper
- else: from db.SqlHelper import SqlHelper as SqlHelper sqlhelper = SqlHelper() sqlhelper.init_db() except Exception,
- e: raise Con_DB_Fail
有感兴趣的朋友,可以将 Redis 的实现方式添加进来。
将项目目录 clone 到当前文件夹
- $ git clone
切换工程目录
- $ cd IPProxyPool $ cd IPProxyPool_py2或者cd IPProxyPool_py3
运行脚本
- python IPProxy.py
成功运行后,打印信息
- IPProxyPool----->>>>>>>>beginning http: //0.0.0.0:8000/
- IPProxyPool----->>>>>>>>db exists ip: 0 IPProxyPool----->>>>>>>>now ip num < MINNUM,
- start crawling...IPProxyPool----->>>>>>>>Success ip num: 134,
- Fail ip num: 7882
- GET /
这种模式用于查询代理 ip 数据,同时加入评分机制,返回数据的顺序是按照评分由高到低,速度由快到慢制定的。
1. 获取 5 个 ip 地址在中国的高匿代理:
2. 响应为 JSON 格式,按照评分由高到低,响应速度由高到低的顺序,返回数据:
- [["122.226.189.55", 138, 10], ["183.61.236.54", 3128, 10], ["61.132.241.109", 808, 10], ["183.61.236.53", 3128, 10], ["122.227.246.102", 808, 10]]
以 ["122.226.189.55", 138, 10] 为例,第一个元素是 ip, 第二个元素是 port,第三个元素是分值 score。
- import requests import json r = requests.get('http://127.0.0.1:8000/?types=0&count=5&country=中国') ip_ports = json.loads(r.text) print ip_ports ip = ip_ports[0][0] port = ip_ports[0][1] proxies = {
- 'http': 'http://%s:%s' % (ip, port),
- 'https': 'http://%s:%s' % (ip, port)
- }
- r = requests.get('http://ip.chinaz.com/', proxies = proxies) r.encoding = 'utf-8'print r.text
- GET / delete
这种模式用于方便用户根据自己的需求删除代理 ip 数据
大家可以根据指定以上一种或几种方式删除数据。
1. 删除 ip 为 120.92.3.127 的代理:
2. 响应为 JSON 格式,返回删除的结果为成功, 失败或者返回删除的个数, 类似如下的效果:
["deleteNum", "ok"] 或者 ["deleteNum", 1]
- import requests r = requests.get('http://127.0.0.1:8000/delete?ip=120.92.3.127') print r.text
以上就是重构后的 IPProxyPool,两周的辛苦没有白费,当然还有不足,之后会陆续添加智能选择代理的功能。
来源: http://www.cnblogs.com/qiyeboy/p/6163474.html