为什么使用bs4无法抓取Xero官方版本说明页面的数据?
问题原因分析
- 请求头配置无效
你代码中添加的Access-Control-*系列头属于CORS机制下的服务端响应头,仅用于服务端告知浏览器跨域访问的权限规则,在客户端发起请求时携带这类头没有任何作用,不会改变服务端的返回结果。 - 页面为动态渲染类型
目标页面的版本说明内容并非嵌入在初始静态HTML中,而是页面加载完成后由JavaScript异步请求后台接口获取数据,再动态渲染到DOM结构里的。你用requests直接请求只能拿到空的页面骨架,BeautifulSoup解析这类静态源码自然提取不到有效内容。
解决方案
方案1:使用支持JS渲染的爬取工具(推荐新手使用)
可以用Playwright、Selenium等无头浏览器工具,模拟真实浏览器的运行逻辑,等待页面JS执行完成、内容全部渲染后再提取数据,不需要额外分析接口规则。
示例代码(基于Playwright):
from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup with sync_playwright() as p: # 启动无头浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page(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") # 访问页面,等待内容加载完成 page.goto("https://central.xero.com/s/article/Xero-Releases", wait_until="networkidle") # 获取渲染完成后的页面源码 page_content = page.content() browser.close() # 用BeautifulSoup解析渲染后的内容 soup = BeautifulSoup(page_content, "html.parser") # 此时可以正常提取版本说明相关的内容 print(soup.title)
方案2:直接调用数据接口(效率更高)
打开浏览器开发者工具的「网络」面板,刷新页面后筛选XHR/ Fetch类型的请求,逐次查看响应内容,找到返回版本说明数据的后台接口,直接请求该接口即可拿到结构化的原始数据,不需要加载冗余的页面资源。
内容的提问来源于stack exchange,提问作者anthony
相关产品推荐
相关产品推荐

