在之前的文章中我们带入了 opener 方法,接下来我们看一下 opener 应用中的 ProxyHandler 处理器(代理设置)。
使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的。
很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问。
所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。
urllib.request 中通过ProxyHandler来设置使用代理服务器,下面代码说明如何使用自定义 opener 来使用代理:
1 import urllib.request 2 3 # 构建了两个代理Handler,一个有代理IP,一个没有代理IP 4 httpproxy_handler = urllib.request.ProxyHandler({"https": "27.191.234.69:9999"}) 5 nullproxy_handler = urllib.request.ProxyHandler({}) 6 7 # 定义一个代理开关 8 proxySwitch = True 9 10 # 通过 urllib.request.build_opener()方法使用这些代理Handler对象,创建自定义opener对象 11 # 根据代理开关是否打开,使用不同的代理模式 12 if proxySwitch: 13 opener = urllib.request.build_opener(httpproxy_handler) 14 else: 15 opener = urllib.request.build_opener(nullproxy_handler) 16 17 request = urllib.request.Request("") 18 19 # 1. 如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。 20 response = opener.open(request) 21 22 # 2. 如果这么写,就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。 23 # urllib.request.install_opener(opener) 24 # response = urllib.request.urlopen(request) 25 26 # 获取服务器响应内容 27 html = response.read().decode("utf-8") 28 29 # 打印字符串 30 print(html)