最近有小伙伴使用爬虫代理的时候发现一个问题,通过爬虫代理发起请求之后,并没有实现每个 HTTP 请求自动分配不同的代理 IP,而是所有请求都是**相同代理 IP 固定使用 20 秒之后,才会切换新的代理 IP,这是什么原因导致的呢?小伙伴提供的部分代码如下:
#! -*- encoding:utf-8 -*- import requests import random # 要访问的目标页面 targetUrl = "http://httpbin.org/ip" # 要访问的目标HTTPS页面 # targetUrl = "https://httpbin.org/ip" # 代理服务器(产品官网 www.16yun.cn) proxyHost = "t.16yun.cn" proxyPort = "31111" # 代理验证信息 proxyUser = "username" proxyPass = "password" proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % { "host" : proxyHost, "port" : proxyPort, "user" : proxyUser, "pass" : proxyPass, } # 设置 http和https访问都是用HTTP代理 proxies = { "http" : proxyMeta, "https" : proxyMeta, } # 设置IP切换头 tunnel = random.randint(1,10000) headers = { ‘Connection’:'keep-alive', 'Accept-Language':'zh', "Proxy-Tunnel": str(tunnel) } for i in range(100): resp = requests.get(targetUrl, proxies=proxies, headers=headers) print resp.status_code print resp.text time.sleep(0.2)
经过调试**,上面的代码主要是两个问题:
1、‘Connection’:’keep-alive’ 需要关闭
keep-alive 是客户端和服务端的协议规范,开启 keep-alive,则服务端在返回 response 后不关闭 TCP 连接,接收完响应报文后,客户端也不关闭连接,发送下一个 HTTP 请求时会重用该连接,这就导 TCP 的链接不断开,因此爬虫代理的自动 IP 切换就失效了。导致一个代理 IP 会****使用,直到该代理 IP 的有效时间 20 秒到期之后,强制关闭 TCP 连接切换新的代理 IP。
2、tunnel 参数设置错误
tunnel 是用来控制代理 IP 切换的控制参数。爬虫代理会检查 tunnel 的数值,数值不同就将 HTTP 请求随机分配一个新代理 IP 转发,tunnel 相同就将 HTTP 请求分配相同的代理 IP 转发。因此为实现每个 HTTP 请求通过不同的代理 IP 转发,就应该在 for 下面实现 tunnel = random.randint (1,10000),确保每次 HTTP 请求中的 tunnel 是不同的数值。