python下scarpy爬虫代理错误407

2023-04-25  本文已影响0人  SunY7

我们在数据采集过程中程序会经常返回一些状态码,响应HTTP请求会返回响应状态码,根据状态码可以知道返回信息代表什么意思。今天我们来分享下关于407。一般爬虫程序是不会返回407的,一般出现407是在我们程序挂了代理以后,比如我们的爬虫程序中添加了由亿牛云提供的爬虫隧道代理。但是运行后程序就报了407错误。

! -- encoding:utf-8 --

    import base64            
    import sys
    import random

    PY3 = sys.version_info[0] >= 3

    def base64ify(bytes_or_str):
        if PY3 and isinstance(bytes_or_str, str):
            input_bytes = bytes_or_str.encode('utf8')
        else:
            input_bytes = bytes_or_str

        output_bytes = base64.urlsafe_b64encode(input_bytes)
        if PY3:
            return output_bytes.decode('ascii')
        else:
            return output_bytes

    class ProxyMiddleware(object):                
        def process_request(self, request, spider):
            # 代理服务器(产品官网 www.16yun.cn)
            proxyHost = "t.16yun.cn"
            proxyPort = "31111"

            # 代理验证信息
            proxyUser = "username"
            proxyPass = "password"

            # [版本>=2.6.2](https://docs.scrapy.org/en/latest/news.html?highlight=2.6.2#scrapy-2-6-2-2022-07-25)无需添加验证头,会自动在请求头中设置Proxy-Authorization     
            request.meta['proxy'] = "http://{0}:{1}@{2}:{3}".format(proxyUser,proxyPass,proxyHost,proxyPort)

            # 版本<2.6.2 需要手动添加代理验证头
            # request.meta['proxy'] = "http://{0}:{1}".format(proxyHost,proxyPort)
            # request.headers['Proxy-Authorization'] = 'Basic ' +  base64ify(proxyUser + ":" + proxyPass)                    

            # 设置IP切换头(根据需求)
            # tunnel = random.randint(1,10000)
            # request.headers['Proxy-Tunnel'] = str(tunnel)

            # 每次访问后关闭TCP链接,强制每次访问切换IP
            request.header['Connection'] = "Close"
image.png

那在什么情况下程序会出现407呢?爬虫程序返回407主要是以下的一些原因:
一、全部是http的407错误,是代理认证信息不对。
这种情况就需要我们检查下代理参数是否配置正确,代理是否已经过期。
二、少量http的407错误,大量http的200请求成功,有些语言库第一次请求不会传递认证信息,自动发起第二次请求并将认证信息传递,属正常情况。
三、少量http的200请求成功,少量http的407错误,大量http的429错误,有可能是每秒请求数大量超出代理限定,代理直接返回相关错误。

上一篇 下一篇

猜你喜欢

热点阅读