You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCP连接zacks.com报Connection reset by peer但AWS正常求助

解决GCP Compute Engine请求zacks.com报"Connection reset by peer"的问题

我之前碰到过类似云厂商IP被目标站点限制的情况,结合你的问题,给你几个排查和解决的方向:

1. 优先排查:目标站点是否拉黑了GCP的IP段

很多网站会对GCP、AWS这类云厂商的IP段做限制(尤其是这类IP常被用作爬虫主机),你可以这么验证:

  • 在GCP和EC2上分别执行curl -4 https://icanhazip.com获取出口IP,再用whois [你的IP]查看IP所属的云厂商
  • 尝试用GCP的IP直接访问zacks.com页面(比如本地用代理切换到这个IP),看是否能正常打开
  • 给GCE实例分配一个新的静态外部IP试试,说不定只是当前IP在黑名单里,新IP能绕过限制

2. 检查SSL/TLS配置差异

AWS和GCP的默认SSL库、TLS版本可能存在差异,导致握手失败:

  • 先在两台机器上对比SSL基础配置:
    python -c "import ssl; print(ssl.OPENSSL_VERSION); print(ssl.get_default_verify_paths())"
    
  • 如果GCP的TLS版本过旧或加密套件不兼容,可以在requests中强制指定TLS版本和兼容的加密套件:
    import requests
    from requests.adapters import HTTPAdapter
    from urllib3.poolmanager import PoolManager
    import ssl
    import datetime as dt
    
    class TLS12Adapter(HTTPAdapter):
        def init_poolmanager(self, *args, **kwargs):
            ctx = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
            ctx.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1  # 禁用老旧TLS版本
            ctx.set_ciphers('ECDHE-RSA-AES128-GCM-SHA256')  # 选用目标站点支持的加密套件
            kwargs['ssl_context'] = ctx
            return super().init_poolmanager(*args, **kwargs)
    
    session = requests.Session()
    session.mount('https://www.zacks.com', TLS12Adapter())
    
    # 发起请求
    epoch_date = int((dt.datetime(2018,2,21) - dt.datetime(1970,1,1)).total_seconds())
    url = f'https://www.zacks.com/includes/classes/z2_class_calendarfunctions_data.php?calltype=eventscal&date={epoch_date}&type=1'
    req = session.get(url)
    print(req.text[:100])
    
  • 也可以用curl测试不同TLS版本的兼容性:
    curl -v --tlsv1.2 https://www.zacks.com/includes/classes/z2_class_calendarfunctions_data.php?calltype=eventscal&date=1519190400&type=1
    curl -v --tlsv1.3 https://www.zacks.com/includes/classes/z2_class_calendarfunctions_data.php?calltype=eventscal&date=1519190400&type=1
    

3. 模拟AWS的请求头

目标站点可能通过请求头(比如User-Agent、Accept等)识别云厂商机器,你可以完全复制EC2上的请求头到GCP代码中:

  • 在EC2上执行curl -v https://www.zacks.com/...,把输出里的Host、User-Agent、Accept等所有请求头复制下来
  • 在GCP的requests中添加这些头:
    import requests
    import datetime as dt
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.5',
        'Connection': 'keep-alive',
        # 复制EC2上的所有请求头
    }
    
    epoch_date = int((dt.datetime(2018,2,21) - dt.datetime(1970,1,1)).total_seconds())
    url = f'https://www.zacks.com/includes/classes/z2_class_calendarfunctions_data.php?calltype=eventscal&date={epoch_date}&type=1'
    req = requests.get(url, headers=headers)
    print(req.text[:100])
    

4. 检查GCP网络配置

  • 确认是否启用了Cloud NAT:如果你的GCE实例用NAT出口,可能共享的IP被目标站点拉黑了,尝试给实例分配独立的静态外部IP
  • 验证出站防火墙规则:执行gcloud compute firewall-rules list,确保有允许所有出站流量(或至少允许443端口)的规则(比如默认的default-allow-egress规则)
  • 用tcpdump抓包分析:在GCE实例上执行tcpdump -i any host www.zacks.com and port 443 -w ssl_handshake.pcap,下载到本地用Wireshark打开,看SSL握手是在哪个阶段被重置的(比如客户端发送Client Hello后被拒绝,还是服务器发送Server Hello后断开)

5. 其他小技巧

  • 尝试切换GCP的网络环境,比如换一个VPC,或者用Cloud VPN连接到本地网络后再请求
  • 查看目标站点的robots.txt,确认是否禁止了爬虫访问该接口

内容的提问来源于stack exchange,提问作者Karun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:19:40