開源IP代理池續——整體重構

作者介紹

七夜,Python中文社區專欄作者,信息安全研究人員,比較擅長網路安全、逆向工程、Python爬蟲開發、Python Web開發。

  • 博客園:cnblogs.com/qiyeboy/
  • CSDN:blog.csdn.net/qiye_/

  • Github:github.com/qiyeboy/

  • 知乎ID:七夜

開源IP代理池

繼上一篇突破反爬蟲的利器——開源IP代理池之後,大家在github,我的公眾號和博客上提出了很多建議。經過兩周時間的努力,基本完成了開源IP代理池IPProxyPool的重構任務,業餘時間基本上都花在上面了。

IPProxyPool相對於之前的版本完成了哪些提升呢?主要包括一下幾個方面:

  1. 使用多進程+協程的方式,將爬取和驗證的效率提高了50倍以上,可以在幾分鐘之內獲取所有的有效IP

  2. 使用web.py作為API伺服器,重構HTTP介面

  3. 增加Mysql,MongoDB等資料庫的適配

  4. 支持python3

  5. 增加了三個代理網站

  6. 增加評分機制,評比穩定的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

以["122.226.189.55", 138, 10]為例,第一個元素是ip,第二個元素是port,第三個元素是分值score。

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的代理:127.0.0.1:8000/delete?

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網頁爬蟲是非法的嗎?

TAG:Python开发 | 爬虫计算机网络 | Python |