如何用BeautifulSoup抓取雅虎财经新闻标题?爬取失败求排查
雅虎财经新闻抓取问题排查与解决
一、BeautifulSoup find()/find_all() 核心逻辑
find():遍历HTML文档树,返回第一个符合匹配规则(标签名、属性、文本等)的元素对象;找不到则返回None。find_all():遍历整个文档树,返回所有符合规则的元素组成的列表;找不到则返回空列表[]。
匹配时可指定标签名(如div)、属性(如class/id)、文本内容,甚至用自定义函数过滤元素。
二、你的代码问题出在哪?
- 选择器过时:你使用的
Py(14px) Pos(r)类名,当前雅虎财经EURUSD页面的新闻区域已不再使用,自然无法匹配到元素。 - 动态加载限制:雅虎财经的新闻内容是通过JavaScript动态渲染的,直接用
requests等工具获取的静态HTML源码里,根本没有新闻相关的DOM结构,即便选择器正确也抓不到内容。
三、解决方法
方法1:用Selenium获取动态渲染后的页面
Selenium可模拟浏览器加载页面,等待JS执行完成后再获取源码,确保拿到完整的新闻DOM。
示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup # 初始化Chrome浏览器(需对应版本的chromedriver) driver = webdriver.Chrome() url = "https://finance.yahoo.com/quote/EURUSD%3DX?p=EURUSD%3DX" driver.get(url) # 等待新闻区域加载完成,最多等待10秒 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CLASS_NAME, "Ovx(a)"))) # 获取渲染后的页面源码 source_s = driver.page_source driver.quit() # 解析HTML并提取标题 html = BeautifulSoup(source_s, "html.parser") news_items = html.find_all("li", class_="js-stream-content") news_titles = [] for item in news_items: title_tag = item.find("a", class_="Fw(b)") if title_tag: news_titles.append(title_tag.get_text(strip=True)) print("新闻标题列表:", news_titles)
方法2:直接调用雅虎财经API(更高效)
雅虎财经提供公开API接口,无需解析HTML,直接请求就能拿到结构化新闻数据,避免页面结构变化的问题。示例(需requests库):
import requests ticker = "EURUSD=X" url = f"https://query1.finance.yahoo.com/v1/finance/search?q={ticker}&newsCount=10" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) data = response.json() # 提取新闻标题 news_titles = [news["title"] for news in data["news"]] print("新闻标题列表:", news_titles)
四、注意事项
- 雅虎财经有反爬机制,请求时务必添加
User-Agent头模拟浏览器请求; - 使用Selenium时,需保证chromedriver版本与浏览器版本匹配;
- API接口可能随平台调整,若失效可查看页面网络请求,定位最新接口地址。
内容的提问来源于stack exchange,提问作者Habi
相关产品推荐
相关产品推荐

