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

从受Cloudflare防护的URL读取Excel文件时遭遇HTTP 503错误的解决方案咨询

解决Cloudflare保护下的Excel文件抓取与Newspaper库503问题

一、RBNZ Excel文件抓取的解决思路

你遇到的503错误确实是因为目标网站启用了Cloudflare的反爬机制,普通请求甚至加了UA的请求都会被拦截。这里有几个实用的解决方法:

1. 使用cloudscraper库绕过Cloudflare验证

这个库专门用来处理Cloudflare的基础防护,它会模拟浏览器行为生成符合要求的请求。步骤如下:

  • 先安装库:
    pip install cloudscraper
    
  • 修改代码示例:
    import cloudscraper
    import pandas as pd
    
    url = "https://www.rbnz.govt.nz/-/media/ReserveBank/Files/Statistics/tables/b2/hb2-daily-close.xlsx"
    scraper = cloudscraper.create_scraper()  # 创建模拟浏览器的请求实例
    content = scraper.get(url).content  # 获取文件二进制内容
    df = pd.read_excel(content, sheet_name="Data", header=4, usecols="A,H")
    

2. 用自动化工具模拟真实浏览器(Selenium/Playwright)

如果Cloudflare防护级别较高,cloudscraper失效的话,就需要用真实浏览器访问。以Selenium为例:

  • 安装依赖:
    pip install selenium
    
  • 代码示例(先下载文件到本地再读取):
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    import pandas as pd
    import time
    
    url = "https://www.rbnz.govt.nz/-/media/ReserveBank/Files/Statistics/tables/b2/hb2-daily-close.xlsx"
    # 配置Chrome下载路径
    chrome_options = Options()
    prefs = {"download.default_directory": "/your/local/download/path"}
    chrome_options.add_experimental_option("prefs", prefs)
    
    driver = webdriver.Chrome(options=chrome_options)
    driver.get(url)
    time.sleep(5)  # 等待文件下载完成
    driver.quit()
    
    # 读取本地文件
    df = pd.read_excel("/your/local/download/path/hb2-daily-close.xlsx", sheet_name="Data", header=4, usecols="A,H")
    

3. 手动下载(临时简便方案)

如果不需要实时获取数据,直接访问目标URL手动下载Excel文件到本地,再用pd.read_excel读取即可,完全不用处理反爬问题。

二、Newspaper库抛出503的替代解决方案

不一定非要用Selenium,还有这些方法可以尝试:

1. 结合cloudscraper获取页面内容

不让Newspaper自行发送请求,而是用cloudscraper先拿到HTML内容,再传给Newspaper的Article对象:

import cloudscraper
from newspaper import Article

url = "your-target-url"
scraper = cloudscraper.create_scraper()
html_content = scraper.get(url).text

article = Article(url)
article.set_html(html_content)  # 手动注入HTML内容
article.parse()
# 后续处理article的标题、正文等内容

2. 完善请求头信息

有时候补充更完整的请求头就能绕过503,比如加上Accept、Accept-Language、Referer等字段:

from newspaper import Article, Config

config = Config()
config.browser_user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0'
config.headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Referer': 'https://www.google.com/'
}

article = Article(url, config=config)
article.download()
article.parse()

3. 自动化工具兜底

如果以上方法都不行,再用Selenium或Playwright获取渲染后的HTML,然后传给Newspaper处理。这种方法适合需要JavaScript加载内容的页面,能应对大部分复杂反爬机制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:24:07