首页 > 社会 > 正文

澳门永利pt高速手机版,自己搭建亿级爬虫IP代理池

[摘要] 以前尝试过自己抓取网络上免费代理ip来搭建代理池,可免费ip质量参差不齐,不仅资源少、速度慢,而且失效快,满足不了快速密集抓取的需求。为了解决这些问题,我想到可以使用squid提供的父代理功能,自动将爬虫服务器的请求转发给代理服务器。squid提供了自动轮询功能,自动验证并剔除不可用的代理。爬虫软件只需将代理设置为squid服务器即可,不需要每次重新设置为其他的代理服务器。

澳门永利pt高速手机版,自己搭建亿级爬虫IP代理池

澳门永利pt高速手机版,做爬虫抓取时,我们经常会碰到网站针对ip地址封锁的反爬虫策略。但只要有大量可用的ip资源,问题自然迎刃而解。

以前尝试过自己抓取网络上免费代理ip来搭建代理池,可免费ip质量参差不齐,不仅资源少、速度慢,而且失效快,满足不了快速密集抓取的需求。

收费代理提供的代理资源质量明显提升,经过多家测试,最终选定使用站大爷作为代理提供平台。

站大爷代理ip平台每天能提供大概24万个不重复的短效高匿代理,每个代理存活期为3分钟,总ip数有20亿,ip数量足够使用。价格为包天17元,包月475元,还有半年及一年的套餐可供选择。只要能满足项目要求,提供优质稳定的服务,这些成本值得付出。

高匿代理才可以真正用来防止爬虫被封锁,如果使用普通代理,爬虫的真实ip还是会暴露。

搭建思路

站大爷提供了大量的代理服务器资源,主要考虑如何将这些服务器分配给爬虫服务器使用。最初的想法是使用redis作为代理服务器资源队列,一个程序自动获取站大爷api提供的代理,验证可用后push到redis里,每个程序再从redis中pop一个代理进行抓取,但这样的缺点是不太好控制每台爬虫服务器的代理质量,有的代理速度快,有的速度比较慢,影响抓取效率,其次就是需要自行维护一套代理验证、分配的程序,增加了代码量,不便后期维护。

为了解决这些问题,我想到可以使用squid提供的父代理功能,自动将爬虫服务器的请求转发给代理服务器。squid提供了自动轮询功能,自动验证并剔除不可用的代理。减少了我们多余的验证步骤。

爬虫软件只需将代理设置为squid服务器即可,不需要每次重新设置为其他的代理服务器。

这套方案明显减少了工作量,提高了易用性和可维护性。

实现过程

1.首先获取代理平台提供的代理服务器资源

o建议购买短效代理,购买后在后台获取api地址并设置ip白名单等参数

2.将获取到的代理服务器写入squid配置文件

o解析网站提供的代理服务器,按照一定规则写入/etc/squid/squid.conf

3.重新配置squid

o写入配置文件之后重新加载最新的文件,不会造成中断

4.自动更新,重复1-3

o由于网站提供的代理存活时间只有2分钟,所以需要每隔一段时间重新获取一批新ip

实现上述要求的代码如下:

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

#!/usr/bin/env python

# coding: utf-8

# zdy.py

'''

squid+站大爷搭建代理ip池

author: nathan

blog: www.xnathan.com

github: github.com/xnathan

'''

import os

import time

import requests

# 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"

def update_conf(proxies):

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 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():

# 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:

print 'no data'

elif 'bad' in res:

print 'bad request'

else:

print 'get all proxies'

proxies = []

for line in res.split():

proxies.append(line.strip().split(':'))

# 2. 写入squid配置文件

update_conf(proxies)

# 3. 重新加载配置文件

os.system('squid -k reconfigure')

print 'done'

def main():

start = time.time()

while true:

# 每60秒获取一批新ip

if time.time() - start >= 60:

get_proxy()

time.sleep(5)

start = time.time()

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)。

10

11

12

#!/usr/bin/env python

# coding: utf-8

'''

代理ip池实例演示

'''

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的封锁。

成本比较低,而且有比较高的易用性,很方便地能结合到各种爬虫应用中,只需要增加一个代理地址即可,而由squid统一管理父代理,不需要在爬虫程序中进行代理的获取验证等等操作,便于维护。

实际使用中还没有发现什么特别重大的问题,更多扩展性还有待后续继续研究。