python搭建匿名代理池
python搭建匿名代理池
如果您是本站會員;我們將為您提供技術支持!!!
本篇文章給大家帶來的內容是介紹如何用Python搭建匿名代理池?搭建匿名代理池的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有所幫助。
常聽到很多人抱怨自己的IP因爬蟲次數太多而被網站屏蔽,不得不頻繁使用各種代理IP,卻又因為網上的公開代理大部分都是不能使用,而又要花錢花精力去申請VIP代理,幾番波折又遭屏蔽。特此寫一篇如何利用Python搭建代理池的文章,以降低時間及精力成本,實現自動化獲取活躍代理IP的功能。
運作原理
一、 網站代理獲取
1. 爬免費代理網站的IP列表測試是否可用及是否是高匿
2. 若都是,則放進資料庫,否則丟棄。
3. 重複第2步
二、 保證失效的代理能被儘快從代理池中挑出
1. 從爬蟲資料庫獲取IP
2. 測試IP的可用性和匿名性
3. 如果可用且匿名,則保留,否則丟棄。
4. 重複第1步
說明①:可建立一個爬蟲程序守護程序(Daemon),有此方面需要的小夥伴可自行谷歌,在此不多做介紹。
說明②:可建立一個對外代理信息介面,無論你用NodeJS或者Flask/Django或者PHP來寫都沒關係,在此也不多做介紹。
實現:
建議庫: requests, BeautifulSoup, re, sqlite3。
其中,用requests庫獲取代理網站頁面,用BeautifulSoup和re兩庫來進行代理信息獲取,用sqlite3來對這些信息進行存取。
如果必要(如代理網站有反爬蟲策略時),可用PhantomJS替代requests,或用相應庫進行數據清理(如base64解碼)。
下面簡單展示一下各部分的代碼:
首先是選擇多個能爬取代理且不容易被屏蔽IP的網站,此處以proxy-list.org為例:
1 |
BASE_URL = "https://proxy-list.org/english/index.php?p=" #IP地址及埠的正則 Re_Pattern_IP = re.compile("(.*):") Re_Pattern_PORT = re.compile(":(.*)") #網站有11頁,所以循環11次獲取所有代理IP及埠 for startingURL_Param in range(1,11): HTML_ProxyPage = requests.get(BASE_URL+str(startingURL_Param)).content soup = bs(HTML_ProxyPage,"html.parser") for Raw_ProxyInfo in soup.find_all("ul",{"class":None}): #此網站有用Base64簡單對代理進行了加密,所以這裡對其解碼 ip_port = base64.b64decode(Raw_ProxyInfo.find("li",{"class":"proxy"}).text.replace("Proxy('","").replace("')","")) #接下來利用正則從網頁數據中提取我們需要的信息 IP = re.findall(Re_Pattern_IP, ip_port)[0] PORT = re.findall(Re_Pattern_PORT, ip_port)[0] TYPE = Raw_ProxyInfo.find("li",{"class":"https"}).text |
接下來是一段簡易代理池框架類的代碼,提供代理資料庫的添加、刪除、可連接性檢測、匿名性檢測
1 |
class ProxyPool: #初始化爬蟲池資料庫 def __init__(self,ProxyPoolDB): self.ProxyPoolDB = ProxyPoolDB self.conn = sqlite3.connect(self.ProxyPoolDB, isolation_level=None) self.cursor = self.conn.cursor() self.TB_ProxyPool = "TB_ProxyPool" self.cursor.execute("CREATE TABLE IF NOT EXISTS "+self.TB_ProxyPool+"(ip TEXT UNIQUE, port INTEGER, protocol TEXT)") #添加代理IP進代理池的介面 def addProxy(self, IP, PORT, PROTOCOL): self.cursor.execute("INSERT OR IGNORE INTO " + self.TB_ProxyPool+"(ip, port, protocol) VALUES (?,?,?)", [IP,PORT,PROTOCOL]) #檢查代理的匿名性及可連接性 def testConnection(self, IP, PORT, PROTOCOL): proxies = { PROTOCOL: IP+":"+PORT } try: OrigionalIP = requests.get("http://icanhazip.com",timeout=REQ_TIMEOUT).content MaskedIP = requests.get("http://icanhazip.com", timeout=REQ_TIMEOUT,proxies=proxies).content if OrigionalIP != MaskedIP: return True else: return False except: return False #刪除代理IP對應的資料庫記錄 def delRecord(self, IP): self.cursor.execute("DELETE FROM "+self.TB_ProxyPool+" WHERE ip=?",(IP,)) |
下面是對代理池進行去「失效IP」的代碼:
1 |
#循環代理池,逐行測試IP地址埠協議是否可用 def cleanNonWorking(self): for info in self.cursor.execute("SELECT * FROM "+self.TB_ProxyPool).fetchall(): IP = info[0] PORT = str(info[1]) PROTOCOL = info[2].lower() isAnonymous = self.testConnection(IP,PORT,PROTOCOL) if isAnonymous == False: #這條代理的可用性失效了,從資料庫里刪除 self.delRecord(IP) #通過檢測icanhazip.com回顯來檢測可用性及匿名性 def testConnection(self, IP, PORT, PROTOCOL): proxies = { PROTOCOL: IP+":"+PORT } try: OrigionalIP = requests.get("http://icanhazip.com",timeout=REQ_TIMEOUT).content MaskedIP = requests.get("http://icanhazip.com", timeout=REQ_TIMEOUT,proxies=proxies).content if OrigionalIP != MaskedIP: return True else: return False except: return False |
反思
這個項目是我當年用Python練手寫的,以現在的程度再來回顧,邏輯不夠嚴謹,各類功能太過耦合,不少段落需要重寫,因為代碼是在校園網內所跑,所以還需要考慮到網路連接的穩定性,這就造成部分代碼之間的混亂關係。
通過icanhazip.com來檢測代理匿名性的方法或許有效,但卻忽略了X-Forwarded-For的HTTP頭,所以有很大風險,必須改進。
驗證代理池內代理的有效性,需要多線程,目前的方案效率太低。
完整代碼
放在此文章中的是代理池的核心代碼,旨在提供各位讀者能夠自己實現的思路及參考,Ubuntu 16.04及Kali下用Python 2.7測試可運行。
1. 帶 [親測] 說明源碼已經被站長親測過!
2. 下載後的源碼請在24小時內刪除,僅供學慣用途!
3. 分享目的僅供大家學習和交流,請不要用於商業用途!
4. 本站資源售價只是贊助,收取費用僅維持本站的日常運營所需!
5. 本站所有資源來源於站長上傳和網路,如有侵權請郵件聯繫站長!
6. 沒帶 [親測] 代表站長時間緊促,站長會保持每天更新 [親測] 源碼 !
7. 盜版ripro用戶購買ripro美化無擔保,若設置不成功/不生效我們不支持退款!
8. 本站提供的源碼、模板、插件等等其他資源,都不包含技術服務請大家諒解!
9. 如果你也有好源碼或者教程,可以到審核區發布,分享有金幣獎勵和額外收入!
10.如果您購買了某個產品,而我們還沒來得及更新,請聯繫站長或留言催更,謝謝理解 !
GG資源網 » python搭建匿名代理池