爬虫代理的技术原理及控制代理IP切换的方法

134 篇文章 0 订阅
120 篇文章 0 订阅

爬虫代理采集隧道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()即可避免链接释放的错误。

欢迎微信联系或者搜索亿牛云索取更多资料。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值