Python爬虫问题请教:同样的requests代码在本地和云主机上一个成功一个失败

PY 新手向各位请教一个问题, 目前的情况: 1、在本地进行 POST 操作,状态返回 503,失败; 2、在云主机运行同样操作,状态成功,取回所需数据; 3、在本地浏览器中直接输入 url 以及参数,状态成功,取回所需数据; 已经排除了 cookie, headers, user-agent 方面的问题

我的问题是: 1、如果网站是以 ip 作为返回 503 的依据,是不是本地浏览器网页中也一定会 503 ? 2、如果不是第 1 种问题的话,还有什么会使得我在本地运行代码会 503 呢?

提前谢谢大家。


Python爬虫问题请教:同样的requests代码在本地和云主机上一个成功一个失败

15 回复

你是不是爬多了自己的 ip 被网站 ban 了


这个问题很常见,核心原因通常是网络环境差异导致的。本地和云主机的IP、出口网络、DNS、甚至运营商策略都不同。

最常见的情况是目标网站针对云服务商IP段(比如阿里云、腾讯云、AWS的IP)做了反爬限制。云主机IP可能被识别为“数据中心IP”而遭到屏蔽或返回不同的内容(比如验证页面)。

排查和解决步骤:

  1. 首先确认差异:在两边分别运行代码,仔细对比响应状态码、响应头、以及响应体HTML内容。云主机返回的可能是403、503,或者包含“Access Denied”、“验证”等字样的页面。

  2. 关键代码对比:把你的请求代码贴出来,重点检查这些部分在两边是否完全一致:

    • headers(特别是 User-Agent, Referer, Accept-Language
    • cookies(如果有)
    • 请求方法(GET/POST)
    • 请求参数
  3. 模拟本地环境:尝试在云主机的请求中添加更完整的、模仿浏览器的请求头。一个基础但更仿真的头可以这样设置:

    import requests
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.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': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1',
        'Sec-Fetch-Dest': 'document',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'none',
        'Sec-Fetch-User': '?1',
    }
    
    response = requests.get('你的目标URL', headers=headers, timeout=10)
    print(response.status_code)
    # 打印前500字符看看内容
    print(response.text[:500])
    
  4. 如果问题依旧:那基本就是IP被针对了。解决方案按复杂度递增:

    • 使用代理:给云主机的请求配置一个高质量的住宅IP代理,这是最直接有效的方法。
      proxies = {
          'http': 'http://你的代理IP:端口',
          'https': 'http://你的代理IP:端口',
      }
      response = requests.get(url, headers=headers, proxies=proxies, timeout=15)
      
    • 降低请求频率:在云主机代码里增加随机延迟。
    • 考虑更换云主机区域:有些网站只屏蔽特定地区的IP段。

总结:先对比响应细节,重点排查IP和请求头差异。

顺便确定是 post 不是 get 么。。。

我也有这个疑问,但是我确实可以网页打开链接,就比较纳闷,难道还可以针对某个 IP 区分 post 和 get 么,只屏蔽 post,不屏蔽 get…

确认过了,晚些我把代码贴出来,囧

楼主先交代一下是不是使用的 N 级运营商的那种野宽带?
说一个自己的经历,野宽带,到处流量穿透那种,访问线上接口(这个接口提供 http 方式访问,也可以使用 java 的一些方法调用[可能没说清楚,反正不是 http 方式调用,我只是个小运维而已。。。]),http 方式和 java 调用显示的来源地址只在同一个 C 段,但不一样。 并不是出口 IP 随机,而是同一种访问方式,出口 IP 是一样的…

我也不知道描述清楚了没有

上面的理论 + 1L 的说法

有些网站不允许同时有 get 和 post,有些网站需要 https

宽带应该没问题啊,电信联通的,况且回到家也没问题…

这个网站倒是没上 https,http://www.creditchina.gov.cn/home 我想做的应该就是模拟“搜索一下”这个按钮的事情吧,抓下来应该是 POST 的动作啊…

说错了,应该是回到家也不成功,是不是我直接应该试试 GET 加参数…

<br>import requests<br><br><br>headers = {<br> 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36',<br>}<br><br>params = (<br> ('keyword', '光大'),<br>)<br><br>r = requests.get('<a target="_blank" href="http://www.creditchina.gov.cn/credit_info_search'" rel="nofollow noopener">http://www.creditchina.gov.cn/credit_info_search'</a>, headers=headers, params=params)<br><br>print(r.json())<br><br>

泪流满面,原来 headers 加多了也会被屏蔽啊…

别抓信用中国了 数据不全漏的也厉害

‘Content-Length’: '119’这个不该是算出来的吗?

光这一家确实不太够,就算是查漏补缺吧,正好也是从易到难练习爬虫…

回到顶部