抓取Crunchbase新闻与动态标签失败,求请求头调整及解决方案
你当前抓取失败的核心原因不是请求头调整这么简单,Crunchbase的signals_and_news板块内容是前端异步渲染的,你用requests拿到的只是页面的静态骨架,没有实际加载的新闻数据,同时该板块的接口请求有更严格的反爬校验。
可行方案
方案1:调用内部数据接口(推荐,性能更高)
该方案直接拉取结构化JSON数据,不需要解析HTML,效率更高:
- 打开浏览器F12开发者工具,切换到「网络」面板,筛选「Fetch/XHR」请求,刷新目标新闻页,找到前缀为
/api/searches/signal的请求,该接口返回的就是完整的新闻列表数据 - 从该请求中复制完整的请求头,重点保留以下必填字段:
Cookie:本地浏览器访问Crunchbase后生成的临时cookie,未登录状态也可使用,有效期数小时X-Cb-Access-Token:Crunchbase前端生成的校验令牌,可直接从请求头中复制Referer:固定为当前新闻页的URL,用来校验请求来源X-Requested-With: XMLHttpRequest:标识为异步接口请求- 替换你当前使用的老旧Firefox 66 UA为最新的浏览器UA,老旧UA极易被反爬策略识别
示例代码:
import requests # 替换为你从开发者工具中拿到的实际接口地址 api_url = "https://www.crunchbase.com/api/searches/signal?q=..." headers = { "User-Agent": "替换为你当前浏览器的最新UA", "Accept": "application/json", "Cookie": "替换为你从开发者工具复制的cookie", "X-Cb-Access-Token": "替换为你复制的access token", "Referer": "https://www.crunchbase.com/organization/duolingo/signals_and_news", "X-Requested-With": "XMLHttpRequest" } response = requests.get(api_url, headers=headers) # 直接解析JSON格式的新闻数据 news_data = response.json() print(news_data)
方案2:无头浏览器渲染(适配性强,无需分析接口)
如果不想手动找接口,可以用Playwright、Selenium等工具模拟浏览器完整加载页面,等待内容渲染完成后直接提取:
以Playwright为例的示例代码:
from playwright.sync_api import sync_playwright with sync_playwright() as p: # 启动无头浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page(user_agent="替换为最新浏览器UA") page.goto("https://www.crunchbase.com/organization/duolingo/signals_and_news") # 等待新闻列表容器渲染完成,选择器可根据实际页面结构调整 page.wait_for_selector(".news-feed-item", timeout=10000) # 提取所有新闻内容 news_items = page.locator(".news-feed-item").all_text_contents() print(news_items) browser.close()
注意事项
- 未登录状态下Crunchbase仅返回最多10条最近新闻,需要更多数据需登录账号后复制登录态的cookie
- 控制请求频率,避免触发IP限流封禁,两次请求间隔建议大于3秒
- 如果出现403错误,优先更新Cookie、UA和X-Cb-Access-Token字段
内容的提问来源于stack exchange,提问作者python-beginner-01
相关产品推荐
相关产品推荐

