開源IP代理池
繼上一篇開源項目IPProxys的使用之后,大家在github,我的公眾號和博客上提出了很多建議。經過兩周時間的努力,基本完成了開源IP代理池IPProxyPool的重構任務,業余時間基本上都花在上面了。(我的新書《Python爬蟲開發與項目實戰》出版了,大家可以看一下樣章)
IPProxyPool相對於之前的版本完成了哪些提升呢?主要包括一下幾個方面:
- 使用多進程+協程的方式,將爬取和驗證的效率提高了50倍以上,可以在幾分鍾之內獲取所有的有效IP
- 使用web.py作為API服務器,重構HTTP接口
- 增加Mysql,MongoDB等數據庫的適配
- 支持python3
- 增加了三個代理網站
- 增加評分機制,評比穩定的ip
大家如果感興趣,可以到github上clone IPProxyPool源碼,已經503 star了。
下面說明一下使用方法:
項目依賴
Ubuntu,debian
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
注意:
- python3下的是pip3
- 有時候使用的gevent版本過低會出現自動退出情況,請使用pip install gevent --upgrade更新)
- 在python3中安裝web.py,不能使用pip,直接下載py3版本的源碼進行安裝
Windows
1.下載sqlite,路徑添加到環境變量
2.安裝requests,chardet,web.py,gevent: pip install requests chardet web.py sqlalchemy gevent
3.安裝lxml: pip install lxml或者下載lxml windows版
注意:
- python3下的是pip3
- 有時候使用的gevent版本過低會出現自動退出情況,請使用pip install gevent --upgrade更新)
- 在python3中安裝web.py,不能使用pip,直接下載py3版本的源碼進行安裝
擴展說明
本項目默認數據庫是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
API 使用方法
第一種模式
GET /
這種模式用於查詢代理ip數據,同時加入評分機制,返回數據的順序是按照評分由高到低,速度由快到慢制定的。
參數

例子
IPProxys默認端口為8000,端口可以在config.py中配置。如果是在本機上測試:1.獲取5個ip地址在中國的高匿代理:http://127.0.0.1:8000/?types=0&count=5&country=中國
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的代理:http://127.0.0.1:8000/delete?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,兩周的辛苦沒有白費,當然還有不足,之后會陸續添加智能選擇代理的功能。