Python爬虫中代理IP本地可用但部署到服务器上不可用的问题如何解决?

一个简单的爬虫,二三十分钟爬一次一个美国网站固定页面的一个数值,无需登录,网站最近才加上的反爬,限制了同一 IP 请求的次数
代码里 header 信息齐全,网站必须美国 IP 请求,所以找了 100 个免费的美国高匿代理,user-agent 也搞了 10 多个,本地跑测试,IP 都可用,程序跑起来一切正常,跑 3 个小时一个 403 没有,但是部署到搬瓦工美国的服务器上,能有三分之一的代理 IP 请求报 403 Forbidden
我把报错的 IP 都存下来,放到本地跑,全部都可用,都能爬到数,然后再弄到服务器上,就是 403,有哪位遇到过这种情况吗,求帮助
python3.6 写的很直白简单的爬虫,搬瓦工洛杉矶的服务器
Python爬虫中代理IP本地可用但部署到服务器上不可用的问题如何解决?


2 回复

这个问题常见,核心是网络环境和配置差异导致的。

首先,直接上诊断和解决方案的代码。在你的爬虫脚本里,部署后立刻添加以下测试块来定位问题:

import requests
import socket

def test_proxy_connection(proxy_url, test_url="http://httpbin.org/ip"):
    """测试代理服务器连通性"""
    proxies = {
        "http": proxy_url,
        "https": proxy_url,
    }
    
    try:
        # 1. 先测试本地DNS和网络
        print("测试服务器本地网络...")
        socket.create_connection(("httpbin.org", 80), timeout=5)
        print("✓ 服务器外网连通正常")
        
        # 2. 测试代理连接
        print(f"\n测试代理连接 {proxy_url}...")
        response = requests.get(test_url, proxies=proxies, timeout=10)
        
        if response.status_code == 200:
            print(f"✓ 代理连接成功,返回IP: {response.json()['origin']}")
            return True
        else:
            print(f"✗ 代理返回异常状态码: {response.status_code}")
            return False
            
    except requests.exceptions.ProxyError as e:
        print(f"✗ 代理服务器错误: {e}")
        print("可能原因:代理服务器拒绝连接、需要认证、或已失效")
    except requests.exceptions.ConnectTimeout:
        print("✗ 连接代理服务器超时")
        print("可能原因:代理IP被服务器网络屏蔽、端口不通")
    except requests.exceptions.SSLError:
        print("✗ SSL证书错误")
        print("尝试添加 verify=False 参数(仅测试用)")
    except Exception as e:
        print(f"✗ 未知错误: {type(e).__name__}: {e}")
    
    return False

# 使用示例
if __name__ == "__main__":
    # 替换为你的代理地址
    proxy = "http://123.45.67.89:8080"
    
    # 如果需要认证
    # proxy = "http://username:password@123.45.67.89:8080"
    
    test_proxy_connection(proxy)

主要问题和解决方案:

  1. 网络环境差异:服务器可能禁止某些IP段或端口。让服务器提供商开放相应端口。

  2. 代理需要认证:有些代理在服务器网络环境下需要额外认证。确保代理字符串包含用户名密码:http://user:pass@ip:port

  3. 超时设置:服务器到代理的网络可能较慢,增加timeout值:

    response = requests.get(url, proxies=proxies, timeout=15)
    
  4. DNS解析问题:服务器可能无法解析代理域名。尝试使用代理IP而非域名。

  5. 代理类型不匹配:明确指定代理类型:

    proxies = {
        "http": "http://proxy_ip:port",
        "https": "http://proxy_ip:port",  # 注意很多HTTPS代理也用http协议
    }
    
  6. 服务器防火墙:检查服务器安全组/防火墙设置,确保出站流量未被限制。

部署前在服务器上直接运行测试脚本,看具体报错信息再针对性解决。

总结:在服务器上跑个网络测试脚本,对比本地环境差异。


在 vps 上试下代理 ip 的连通性

回到顶部