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


開源IP代理池

繼上一篇開源項目IPProxys的使用之后,大家在github,我的公眾號和博客上提出了很多建議。經過兩周時間的努力,基本完成了開源IP代理池IPProxyPool的重構任務,業余時間基本上都花在上面了。(我的新書《Python爬蟲開發與項目實戰》出版了,大家可以看一下樣章

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數據庫並啟動
第二步:安裝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的代理:
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,兩周的辛苦沒有白費,當然還有不足,之后會陸續添加智能選擇代理的功能。

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM