這篇文章主要介紹“Squid代理服務器怎么搭建億級爬蟲IP代理池”,在日常操作中,相信很多人在Squid代理服務器怎么搭建億級爬蟲IP代理池問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Squid代理服務器怎么搭建億級爬蟲IP代理池”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
搭建思路
這里提供了大量的代理服務器資源,主要考慮如何將這些服務器分配給爬蟲服務器使用。最初的想法是使用Redis作為代理服務器資源隊列,一個程序自動獲取站大爺API提供的代理,驗證可用后push到Redis里,每個程序再從Redis中pop一個代理進行抓取,但這樣的缺點是不太好控制每臺爬蟲服務器的代理質量,有的代理速度快,有的速度比較慢,影響抓取效率,其次就是需要自行維護一套代理驗證、分配的程序,增加了代碼量,不便后期維護。
為了解決這些問題,我想到可以使用 Squid 提供的父代理功能,自動將爬蟲服務器的請求轉發給代理服務器。Squid提供了自動輪詢功能,自動驗證并剔除不可用的代理。減少了我們多余的驗證步驟。
爬蟲軟件只需將代理設置為 Squid 服務器即可,不需要每次重新設置為其他的代理服務器。
這套方案明顯減少了工作量,提高了易用性和可維護性。
實現過程
1.首先獲取代理平臺提供的代理服務器資源
建議購買短效代理,購買后在后臺獲取API地址并設置IP白名單等參數
2.將獲取到的代理服務器寫入squid配置文件
解析網站提供的代理服務器,按照一定規則寫入 /etc/squid/squid.conf
3.重新配置 squid
寫入配置文件之后重新加載***的文件,不會造成中斷
4.自動更新,重復1-3
由于網站提供的代理存活時間只有2分鐘,所以需要每隔一段時間重新獲取一批新IP
from gevent import monkey # isort:skip monkey.patch_all() # isort:skip import logging import os import time import requests from gevent.pool import Pool logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) formatter = logging.Formatter( "%(asctime)s - %(name)s - %(levelname)s: - %(message)s", datefmt="%Y-%m-%d %H:%M:%S" ) # 使用StreamHandler輸出到屏幕 ch = logging.StreamHandler() ch.setLevel(logging.INFO) ch.setFormatter(formatter) logger.addHandler(ch) # Squid的配置文件語法 # 將請求轉發到父代理 PEER_CONF = "cache_peer %s parent %s 0 no-query weighted-round-robin weight=1 connect-fail-limit=2 allow-miss max-conn=5\n" # 可用代理 GOOD_PROXIES = [] pool = Pool(50) def check_proxy(proxy): """驗證代理是否可用 :param proxy list:[ip, port]""" global GOOD_PROXIES ip, port = proxy _proxies = {"http": "{}:{}".format(ip, port)} try: ip_url = "http://2019.ip138.com/ic.asp" res = requests.get(ip_url, proxies=_proxies, timeout=10) assert ip in res.content logger.info("[GOOD] - {}:{}".format(ip, port)) GOOD_PROXIES.append(proxy) except Exception as e: logger.error("[BAD] - {}:{}, {}".format(ip, port, e)) def update_conf(): with open("/etc/squid/squid.conf.original", "r") as F: squid_conf = F.readlines() squid_conf.append("\n# Cache peer config\n") for proxy in GOOD_PROXIES: squid_conf.append(PEER_CONF % (proxy[0], proxy[1])) with open("/etc/squid/squid.conf", "w") as F: F.writelines(squid_conf) def get_proxy(): global GOOD_PROXIES GOOD_PROXIES = [] # 1. 獲取代理IP資源 api_url = "http://s.zdaye.com/?api=YOUR_API&count=100&fitter=1&px=2" res = requests.get(api_url).content if len(res) == 0: logger.error("no data") elif "bad" in res: logger.error("bad request") else: logger.info("get all proxies") proxies = [] for line in res.split(): proxies.append(line.strip().split(":")) pool.map(check_proxy, proxies) pool.join() # 2. 寫入Squid配置文件 update_conf() # 3. 重新加載配置文件 os.system("squid -k reconfigure") logger.info(">>>> DONE! <<<<") def main(): start = time.time() while True: # 每30秒獲取一批新IP if time.time() - start >= 30: get_proxy() start = time.time() time.sleep(5) if __name__ == "__main__": main()
使用方法
1.按Squid 搭建正向代理服務器、Squid 配置高匿代理介紹的方法搭建運行 Squid 高匿服務器
2.備份原始配置文件cp /etc/squid/squid.conf /etc/squid/squid.conf.original,以供軟件使用
3.在squid服務器上運行python zdy.py
實例
如果按照上述方法搭建好代理IP池,只需要在爬蟲代碼中設置設置squid代理服務器地址和端口(比如139.xxx.xxx.66:3188)。
from __future__ import print_function import requests s = requests.Session() s.proxies.update({"http": "139.xxx.xxx.66:3188"}) print(s.get("http://httpbin.org/ip"))
每次運行這個程序時,返回的IP都不一樣,而且僅有一個,說明IP代理池已經搭建成功,可以應用在網絡爬蟲項目中。
到此,關于“Squid代理服務器怎么搭建億級爬蟲IP代理池”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。