从受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
相关产品推荐
相关产品推荐

