如何用关键词‘Green hydrogen’抓取CNBC新闻?代码空输出解决方法
解决CNBC搜索页动态内容抓取空输出的问题
你的代码返回空输出,核心原因是CNBC的搜索结果是通过JavaScript动态渲染的:requests.get只能获取页面的初始静态HTML,此时目标元素<span class="Card-title">还未被加载,所以BeautifulSoup找不到任何匹配的元素。
下面提供两种可行的解决方法:
方法一:用Selenium模拟浏览器渲染动态内容
Selenium可以模拟真实浏览器加载页面,等待JavaScript执行完成后再抓取内容,步骤如下:
- 先安装依赖:
pip install selenium beautifulsoup4
下载对应浏览器的驱动(比如ChromeDriver,需和你的Chrome版本匹配),确保驱动路径能被Python找到。
替换后的代码:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By cnbc_url = "https://www.cnbc.com/search/?query=green%20hydrogen&qsearchterm=green%20hydrogen" # 配置Chrome无头模式(可选,不弹出浏览器窗口) chrome_options = Options() chrome_options.add_argument("--headless=new") # 启动浏览器并加载页面 driver = webdriver.Chrome(options=chrome_options) driver.get(cnbc_url) # 等待目标元素加载完成(最多等待10秒) try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "Card-title")) ) # 获取渲染后的完整页面源码 page_source = driver.page_source bsobj = BeautifulSoup(page_source, 'html.parser') # 提取并打印标题 for title_span in bsobj.find_all('span', class_='Card-title'): print('Headlines : {}'.format(title_span.text.strip())) finally: driver.quit() # 关闭浏览器
方法二:直接请求后台API接口(更高效)
动态加载的内容通常来自后台API,你可以通过浏览器开发者工具抓包找到对应的接口,直接请求接口获取数据,无需渲染页面:
- 打开浏览器的开发者工具(F12),切换到「网络」标签页,刷新CNBC搜索页,找到返回搜索结果的API请求(通常是XHR或Fetch类型)。
- 复制该API的URL,直接用
requests请求并解析返回的JSON/XML数据。
示例代码(假设找到的API接口如下,实际需以抓包结果为准):
import requests # 替换为你抓包得到的真实API地址 api_url = "https://search.cnbc.com/rs/search/combinedcms/view.xml?query=green%20hydrogen&qsearchterm=green%20hydrogen&sort=date&size=10" response = requests.get(api_url) # 解析XML格式的响应(如果是JSON则用response.json()) from bs4 import BeautifulSoup bsobj = BeautifulSoup(response.content, 'xml') # 提取标题(根据API返回的结构调整) for item in bsobj.find_all('item'): print('Headlines : {}'.format(item.title.text.strip()))
注意事项
- Selenium的浏览器驱动需和浏览器版本匹配,否则会报错;
- 网站的API接口可能会随时调整,若接口失效需重新抓包获取最新地址;
- 频繁请求可能触发网站反爬机制,建议添加请求间隔或设置请求头模拟浏览器。
内容的提问来源于stack exchange,提问作者Hitesh Prajapati
相关产品推荐
相关产品推荐

