爬虫代理采集隧道IP技术。所谓隧道 IP,指的是一种网络通信技术,可以通过建立隧道来实现两个网络之间的连接。在这种情况下,隧道 IP 就是隧道的终端点。通过隧道 IP,你可以连接到隧道的另一端,并实现网络隔离的两部分之间的通信。
隧道 IP 具有许多优点,例如可以跨网络连接,可以隐藏内部网络的真实 IP 地址,可以提供安全通道等。例如“爬虫服务器”通过隧道与“爬虫代理服务器”建立连接,然后“爬虫代理服务器”根据爬虫策略或“爬虫服务器”的要求,对IP池进行精确控制后,将每个请求分配到不同的代理IP进行双向转发。目标网站服务器只能看大量代理IP地址,从而隐藏了爬虫服务器。
爬虫代理的相对于其他代理IP产品的有点是延迟低、切换快、使用方便。通过下面的代码,可以简单的演示如何使用:
#! -*- encoding:utf-8 -*-
import requests
import random
import requests.adapters
# 要访问的目标页面
targetUrlList = [
"https://httpbin.org/ip",
"https://httpbin.org/headers",
"https://httpbin.org/user-agent",
]
# 代理服务器(产品官网 www.16yun.cn)
proxyHost = "t.16yun.cn"
proxyPort = "666666"
# 代理验证信息
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 = {"Proxy-Tunnel": str(tunnel)}
class HTTPAdapter(requests.adapters.HTTPAdapter):
def proxy_headers(self, proxy):
headers = super(HTTPAdapter, self).proxy_headers(proxy)
if hasattr(self, 'tunnel'):
headers['Proxy-Tunnel'] = self.tunnel
return headers
# 访问三次网站,使用相同的tunnel标志,均能够保持相同的外网IP
for i in range(3):
s = requests.session()
a = HTTPAdapter()
# 设置IP切换头
a.tunnel = tunnel
s.mount('https://', a)
for url in targetUrlList:
r = s.get(url, proxies=proxies)
print r.text
上面的代码,可以实现三个https链接请求从相同的代理IP发出。这种方式适合一些网站在采集过程中要求多个页面保持相同IP的情况。
如果要实现每次请求为不同代理IP,只需要控制每次请求中 tunnel 为随机数即可。
在以上demo使用过程中,一定要避免出现CLOSE_WAIT无法释放的问题。CLOSE_WAIT 状态通常表示客户端已经关闭了连接,但是服务器端还没有收到关闭连接的请求,因此连接处于等待状态。
在 Python 中使用 requests 库发送 HTTP 请求时,如果出现 CLOSE_WAIT 状态,可能是由于每次请求没有正确关闭连接造成的。为了避免这个问题,建议在发送完请求后手动关闭连接。例如:
import requests
# 发送 HTTP 请求
response = requests.get("http://www.example.com")
# 关闭连接
response.close()
在上面的代码中,我们使用 requests.get() 方法发送了一个 HTTP 请求,并获取了响应。然后,我们使用 response.close() 方法关闭了连接。这样做的好处是可以及时释放连接,避免出现 CLOSE_WAIT 状态。
结合前面的爬虫程序,只需要在每次请求之后(包括异常情况也需要),强制requests.session.close()即可避免链接释放的错误。
欢迎微信联系或者搜索亿牛云索取更多资料。