Squid代理服务器怎么搭建亿级爬虫IP代理池

发布时间:2021-09-14 18:13 来源:亿速云 阅读:0 作者:chen 栏目: 服务器

这篇文章主要介绍“Squid代理怎么搭建亿级爬虫IP代理池”,在日常操作中,相信很多人在Squid代理服务器怎么搭建亿级爬虫IP代理池问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Squid代理服务器怎么搭建亿级爬虫IP代理池”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

搭建思路

这里提供了大量的代理服务器资源,主要考虑如何将这些服务器分配给爬虫服务器使用。最初的想法是使用作为代理服务器资源队列,一个程序自动获取站大爷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代理池已经搭建成功,可以应用在网络爬虫项目中。

免责声明:本站发布的内容(图片、视频和文字)以原创、来自本网站内容采集于网络互联网转载等其它媒体和分享为主,内容观点不代表本网站立场,如侵犯了原作者的版权,请告知一经查实,将立刻删除涉嫌侵权内容,联系QQ:712375056。