開源IP代理池續——整體重構
作者介紹
七夜,Python中文社區專欄作者,信息安全研究人員,比較擅長網路安全、逆向工程、Python爬蟲開發、Python Web開發。
- 博客園:http://cnblogs.com/qiyeboy/
- CSDN:http://blog.csdn.net/qiye_/
- Github:https://github.com/qiyeboy/
- 知乎ID:七夜
開源IP代理池
繼上一篇突破反爬蟲的利器——開源IP代理池之後,大家在github,我的公眾號和博客上提出了很多建議。經過兩周時間的努力,基本完成了開源IP代理池IPProxyPool的重構任務,業餘時間基本上都花在上面了。
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資料庫並啟動n第二步:安裝MySQLdb或者pymysql(推薦)n第三步:在config.py文件中配置DB_CONFIG。如果安裝的是MySQLdb模塊,配置如下:n DB_CONFIG={n DB_CONNECT_TYPE:sqlalchemy,n DB_CONNECT_STRING = mysql+mysqldb://root:root@localhost/proxy?charset=utf8n }n 如果安裝的是pymysql模塊,配置如下:n DB_CONFIG={n DB_CONNECT_TYPE:sqlalchemy,n DB_CONNECT_STRING = mysql+pymysql://root:root@localhost/proxy?charset=utf8n }n
sqlalchemy下的DB_CONNECT_STRING參考支持資料庫,理論上使用這種配置方式不只是適配MySQL,sqlalchemy支持的資料庫都可以,但是僅僅測試過MySQL。
2.MongoDB配置第一步:首先安裝MongoDB資料庫並啟動n第二步:安裝pymongo模塊n第三步:在config.py文件中配置DB_CONFIG。配置類似如下:n DB_CONFIG={n DB_CONNECT_TYPE:pymongo,n DB_CONNECT_STRING = mongodb://localhost:27017/n }n
由於sqlalchemy並不支持MongoDB,因此額外添加了pymongo模式,DB_CONNECT_STRING參考pymongo的連接字元串。
注意如果大家想拓展其他資料庫,可以直接繼承db下ISqlHelper類,實現其中的方法,具體實現參考我的代碼,然後在DataStore中導入類即可。
try:n if DB_CONFIG[DB_CONNECT_TYPE] == pymongo:n from db.MongoHelper import MongoHelper as SqlHelpern else:n from db.SqlHelper import SqlHelper as SqlHelpern sqlhelper = SqlHelper()n sqlhelper.init_db()nexcept Exception,e:n raise Con_DB_Failn
有感興趣的朋友,可以將Redis的實現方式添加進來。
如何使用
將項目目錄clone到當前文件夾
$ git clone
切換工程目錄
$ cd IPProxyPooln$ cd IPProxyPool_py2 或者 cd IPProxyPool_py3n
運行腳本
python IPProxy.pyn
成功運行後,列印信息
IPProxyPool----->>>>>>>>beginningnhttp://0.0.0.0:8000/nIPProxyPool----->>>>>>>>db exists ip:0nIPProxyPool----->>>>>>>>now ip num < MINNUM,start crawling...nIPProxyPool----->>>>>>>>Success ip num :134,Fail ip num:7882n
API 使用方法
第一種模式
GET /n
這種模式用於查詢代理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]]n
import requestsnimport jsonnr = requests.get(http://127.0.0.1:8000/?types=0&count=5&country=中國)nip_ports = json.loads(r.text)nprint ip_portsnip = ip_ports[0][0]nport = ip_ports[0][1]nproxies={n http:http://%s:%s%(ip,port),n https:http://%s:%s%(ip,port)n}nr = requests.get(http://ip.chinaz.com/,proxies=proxies)nr.encoding=utf-8nprint r.textn
第二種模式
GET /deleten
這種模式用於方便用戶根據自己的需求刪除代理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 requestsnr = requests.get(http://127.0.0.1:8000/delete?ip=120.92.3.127)nprint r.textn
以上就是重構後的IPProxyPool,兩周的辛苦沒有白費,當然還有不足,之後會陸續添加智能選擇代理的功能。
推薦閱讀:
※對寫的python代碼進行加密有什麼好的實現方法?
※什麼時候會用到python裝飾器?
※如何使用Python實現多進程編程?
※如何開發Python第三方庫?
※python網頁爬蟲是非法的嗎?