设为首页 - 加入收藏 哈密站长网 (http://www.0902zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 2017 2003 控制
当前位置: 首页 > 精华综合 > 外闻 > 正文

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

发布时间:2019-06-19 03:56 所属栏目:[外闻] 来源:Python乱炖
导读:做爬虫抓取时,我们经常会碰到网站针对IP地址封锁的反爬虫策略。但只要有大量可用的IP资源,问题自然迎刃而解。 以前尝试过自己抓取网络上免费代理IP来搭建代理池,可免费IP质量参差不齐,不仅资源少、速度慢,而且失效快,满足不了快速密集抓取的需求。

做爬虫抓取时,我们经常会碰到网站针对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. ?
  16. #?使用StreamHandler输出到屏幕?
  17. ch?=?logging.StreamHandler()?
  18. ch.setLevel(logging.INFO)?
  19. ch.setFormatter(formatter)?
  20. ?
  21. logger.addHandler(ch)?
  22. ?
  23. #?Squid的配置文件语法?
  24. #?将请求转发到父代理?
  25. 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"?
  26. #?可用代理?
  27. GOOD_PROXIES?=?[]?
  28. ?
  29. pool?=?Pool(50)?
  30. ?
  31. ?
  32. def?check_proxy(proxy):?
  33. ????"""验证代理是否可用?
  34. ????:param?proxy?list:[ip,?port]"""?
  35. ????global?GOOD_PROXIES?
  36. ????ip,?port?=?proxy?
  37. ????_proxies?=?{"http":?"{}:{}".format(ip,?port)}?
  38. ????try:?
  39. ????????ip_url?=?"http://2019.ip138.com/ic.asp"?
  40. ????????res?=?requests.get(ip_url,?proxies=_proxies,?timeout=10)?
  41. ????????assert?ip?in?res.content?
  42. ????????logger.info("[GOOD]?-?{}:{}".format(ip,?port))?
  43. ????????GOOD_PROXIES.append(proxy)?
  44. ????except?Exception?as?e:?
  45. ????????logger.error("[BAD]?-?{}:{},?{}".format(ip,?port,?e))?
  46. ?
  47. ?
  48. def?update_conf():?
  49. ????with?open("/etc/squid/squid.conf.original",?"r")?as?F:?
  50. ????????squid_conf?=?F.readlines()?
  51. ????squid_conf.append("\n#?Cache?peer?config\n")?
  52. ????for?proxy?in?GOOD_PROXIES:?
  53. ????????squid_conf.append(PEER_CONF?%?(proxy[0],?proxy[1]))?
  54. ????with?open("/etc/squid/squid.conf",?"w")?as?F:?
  55. ????????F.writelines(squid_conf)?
  56. ?
  57. ?
  58. def?get_proxy():?
  59. ????global?GOOD_PROXIES?
  60. ????GOOD_PROXIES?=?[]?
  61. ????#?1.?获取代理IP资源?
  62. ????api_url?=?"http://s.zdaye.com/?api=YOUR_API&count=100&fitter=1&px=2"?
  63. ????res?=?requests.get(api_url).content?
  64. ????if?len(res)?==?0:?
  65. ????????logger.error("no?data")?
  66. ????elif?"bad"?in?res:?
  67. ????????logger.error("bad?request")?
  68. ????else:?
  69. ????????logger.info("get?all?proxies")?
  70. ????????proxies?=?[]?
  71. ????????for?line?in?res.split():?
  72. ????????????proxies.append(line.strip().split(":"))?
  73. ????????pool.map(check_proxy,?proxies)?
  74. ????????pool.join()?
  75. ????????#?2.?写入Squid配置文件?
  76. ????????update_conf()?
  77. ????????#?3.?重新加载配置文件?
  78. ????????os.system("squid?-k?reconfigure")?
  79. ????????logger.info(">>>>?DONE!?<<<<")?
  80. ?
  81. ?
  82. def?main():?
  83. ????start?=?time.time()?
  84. ????while?True:?
  85. ????????#?每30秒获取一批新IP?
  86. ????????if?time.time()?-?start?>=?30:?
  87. ????????????get_proxy()?
  88. ????????????start?=?time.time()?
  89. ????????time.sleep(5)?
  90. ?
  91. ?
  92. if?__name__?==?"__main__":?
  93. ????main()?

使用方法

1.按Squid 搭建正向代理服务器、Squid 配置高匿代理介绍的方法搭建运行 Squid 高匿服务器

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

3.在squid服务器上运行python zdy.py

实例

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章