当前位置: 首页 > 科技观察

Squid代理服务器构建了1亿个爬虫IP的代理池

时间:2023-03-12 05:38:38 科技观察

在做爬虫爬取的时候,我们经常会遇到网站反爬虫策略封IP地址。但是只要有大量可用的IP资源,问题自然就迎刃而解了。之前尝试过在网上抓取免费代理IP来搭建代理池,但是免费IP的质量参差不齐。不仅资源少,而且速度慢,而且很快失效,不能满足快速密集爬取的需求。收费代理机构提供的代理资源质量显着提升,最终选定詹大业作为代理提供商平台。詹叔每天可以提供5万个左右的不重复短效高匿名代理,每个代理生存期2分钟,总IP数20亿,足够用了。价格为30元一天,500元一个月,有半年和一年套餐可供选择。只要能满足项目要求,提供优质稳定的服务,这些成本是值得付出的。高匿名代理确实可以用来防止爬虫被屏蔽。如果使用普通代理,爬虫的真实IP还是会暴露的。构思大师站提供了大量的代理服务器资源,主要考虑如何将这些服务器分配给爬虫服务器。最初的想法是使用Redis作为代理服务器资源队列。程序自动获取masterAPI提供的proxy,验证可用后推送到Redis。然后每个程序从Redis弹出一个代理去抓取,但是这样做的缺点是不太容易控制每个爬虫服务器的代理质量。代理有的快,有的慢,影响爬取效率。其次,需要自己维护一套代理验证分发程序,增加了代码量,对后期也不方便。维持。为了解决这些问题,我想到了利用squid提供的父代理功能,自动将爬虫服务器的请求转发给代理服务器。Squid提供自动轮询功能来自动验证和消除不可用的代理。减少了我们冗余的验证步骤。爬虫软件只需要将代理设置为squid服务器即可,不需要每次都设置为其他代理服务器。这套方案大大减少了工作量,提高了易用性和可维护性。实现过程1.首先获取代理平台提供的代理服务器资源。建议购买短期代理。购买后,后台获取API地址,设置IP白名单等参数。2.将获取到的代理服务器写入squid配置文件,解析网站提供的代理服务器,按照一定规则写入/etc/squid/squid.conf3.重新配置squid,写入配置文件后重新加载最新文件,不间断4.自动更新,重复1-3由于提供的网址代理的存活时间只有2分钟,所以需要每隔一段时间获取一批新的IP。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%sparent%s0no-queryweighted-round-robinweight=1connect-fail-limit=2allow-missmax-conn=5\n"#可用代理GOOD_PROXIES=[]pool=Pool(50)defcheck_proxy(proxy):"""验证代理是否可用:paramproxylist:[ip,port]"""globalGOOD_PROXIESip,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)assertipinres.contentlogger.info("[GOOD]-{}:{}".format(ip,port))GOOD_PROXIES.append(proxy)exceptExceptionase:logger.error("[BAD]-{}:{},{}".format(ip,port,e))defupdate_conf():withopen("/etc/squid/squid.conf.original","r")asF:squid_conf=F.readlines()squid_conf.append("\n#Cachepeerconfig\n")forproxyinGOOD_PROXIES:squid_conf.append(PEER_CONF%(proxy[0],proxy[1]))withopen("/etc/squid/squid.conf","w")asF:F.writelines(squid_conf)defget_proxy():globalGOOD_PROXIESGOOD_PROXIES=[]#1.获取代理IP资源api_url="http://s.zdaye.com/?api=YOUR_API&count=100&fitter=1&px=2"res=requests.get(api_url).contentiflen(res)==0:logger.error("nodata")elif"bad"inres:logger.error("badrequest")else:logger.info("getallproxies")proxies=[]forlineinres.split():proxies.append(line.strip().split(":"))pool.map(check_proxy,proxies)pool.join()#2.写入squid配置文件update_conf()#3。重新加载配置文件os.system("squid-kreconfigure")logger.info(">>>>DONE!<<<<")defmain():start=time.time()whileTrue:#获取一批新的每30秒IPiftime.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服务器上运行pythonzdy.py实例如果按照上述方法搭建代理IP池,只需要在爬虫代码中设置squid代理服务器地址和端口即可(例如139.xxx.xxx.66:3188)from__future__importprint_functionimportrequestss=requests.Session()s.proxies.update({"http":"139.xxx.xxx.66:3188"})print(s.get("http://httpbin.org/ip"))每次运行这个程序,返回的IP都是ddifferent,并且只有一个IP代理池,说明IP代理池搭建成功,可以在网络爬虫项目中使用。总结本方案结合了网上大量优质的代理资源和Squid服务器提供的特性,基本解决了网站对爬虫IP的封锁。成本比较低,易用性比较高。它可以很容易地集成到各种爬虫应用程序中。它只需要添加一个代理地址,父代理由squid统一管理,不需要在爬虫程序中代理。采集、验证等操作易于维护。实际使用中没有发现特别大的问题,更多的可扩展性有待后续研究。项目地址:https://github.com/xNathan/squid_proxy_pool

猜你喜欢