加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

Squid署理处事器搭建亿级爬虫IP署理池

发布时间:2019-06-19 01:02:29 所属栏目:业界 来源:Python乱炖
导读:做爬虫抓取时,我们常常会遇到网站针对IP地点封闭的反爬虫计策。但只要有大量可用的IP资源,题目天然迎刃而解。 早年实行过本身抓取收集上免费署理IP来搭建署理池,可免费IP质量东倒西歪,不只资源少、速率慢,并且失效快,满意不了快速麋集抓取的需求。
副问题[/!--empirenews.page--]

做爬虫抓取时,我们常常会遇到网站针对IP地点封闭的反爬虫计策。但只要有大量可用的IP资源,题目天然迎刃而解。

早年实行过本身抓取收集上免费署理IP来搭建署理池,可免费IP质量东倒西歪,不只资源少、速率慢,并且失效快,满意不了快速麋集抓取的需求。

收费署理提供的署理资源质量明明晋升,最终选定行使站大爷作为署理提供平台。

站大爷天天能提供或许5万个不一再的短效高匿署理,每个署理存活期为2分钟,总IP数有20亿,IP数目足够行使。价值为包天30元,包月500元,尚有半年及一年的套餐可供选择。只要能满意项目要求,提供优质不变的处事,这些本钱值得支付。

Squid署理处事器搭建亿级爬虫IP署理池

高匿署理才可以真正用来防备爬虫被封闭,假如行使平凡署理,爬虫的真实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
  1. from gevent import monkey  # isort:skip 
  2. monkey.patch_all()  # isort:skip 
  3. import logging 
  4. import os 
  5. import time 
  6.  
  7. import requests 
  8. from gevent.pool import Pool 
  9.  
  10. logger = logging.getLogger(__name__) 
  11. logger.setLevel(logging.INFO) 
  12. formatter = logging.Formatter( 
  13.     "%(asctime)s - %(name)s - %(levelname)s: - %(message)s", datefmt="%Y-%m-%d %H:%M:%S" 
  14.  
  15. # 行使StreamHandler输出到屏幕 
  16. ch = logging.StreamHandler() 
  17. ch.setLevel(logging.INFO) 
  18. ch.setFormatter(formatter) 
  19.  
  20. logger.addHandler(ch) 
  21.  
  22. # Squid的设置文件语法 
  23. # 将哀求转发到父署理 
  24. PEER_CONF = "cache_peer %s parent %s 0 no-query weighted-round-robin weight=1 connect-fail-limit=2 allow-miss max-conn=5n" 
  25. # 可用署理 
  26. GOOD_PROXIES = [] 
  27.  
  28. pool = Pool(50) 
  29.  
  30.  
  31. def check_proxy(proxy): 
  32.     """验证署理是否可用 
  33.     :param proxy list:[ip, port]""" 
  34.     global GOOD_PROXIES 
  35.     ip, port = proxy 
  36.     _proxies = {"http": "{}:{}".format(ip, port)} 
  37.     try: 
  38.         ip_url = "http://2019.ip138.com/ic.asp" 
  39.         res = requests.get(ip_url, proxies=_proxies, timeout=10) 
  40.         assert ip in res.content 
  41.         logger.info("[GOOD] - {}:{}".format(ip, port)) 
  42.         GOOD_PROXIES.append(proxy) 
  43.     except Exception as e: 
  44.         logger.error("[BAD] - {}:{}, {}".format(ip, port, e)) 
  45.  
  46.  
  47. def update_conf(): 
  48.     with open("/etc/squid/squid.conf.original", "r") as F: 
  49.         squid_conf = F.readlines() 
  50.     squid_conf.append("n# Cache peer confign") 
  51.     for proxy in GOOD_PROXIES: 
  52.         squid_conf.append(PEER_CONF % (proxy[0], proxy[1])) 
  53.     with open("/etc/squid/squid.conf", "w") as F: 
  54.         F.writelines(squid_conf) 
  55.  
  56.  
  57. def get_proxy(): 
  58.     global GOOD_PROXIES 
  59.     GOOD_PROXIES = [] 
  60.     # 1. 获取署理IP资源 
  61.     api_url = "http://s.zdaye.com/?api=YOUR_API&count=100&fitter=1&px=2" 
  62.     res = requests.get(api_url).content 
  63.     if len(res) == 0: 
  64.         logger.error("no data") 
  65.     elif "bad" in res: 
  66.         logger.error("bad request") 
  67.     else: 
  68.         logger.info("get all proxies") 
  69.         proxies = [] 
  70.         for line in res.split(): 
  71.             proxies.append(line.strip().split(":")) 
  72.         pool.map(check_proxy, proxies) 
  73.         pool.join() 
  74.         # 2. 写入Squid设置文件 
  75.         update_conf() 
  76.         # 3. 从头加载设置文件 
  77.         os.system("squid -k reconfigure") 
  78.         logger.info(">>>> DONE! <<<<") 
  79.  
  80.  
  81. def main(): 
  82.     start = time.time() 
  83.     while True: 
  84.         # 每30秒获取一批新IP 
  85.         if time.time() - start >= 30: 
  86.             get_proxy() 
  87.             start = time.time() 
  88.         time.sleep(5) 
  89.  
  90.  
  91. if __name__ == "__main__": 
  92.     main() 

行使要领

1.按Squid 搭建正向署理处事器、Squid 设置高匿署理先容的要领搭建运行 Squid 高匿处事器

2.备份原始设置文件cp /etc/squid/squid.conf /etc/squid/squid.conf.original,以供软件行使

3.在squid处事器上运行python zdy.py

实例

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读