使用Python Selenium获取动态生成内容失败的技术求助
搞定雅虎财经「Recommended Rating」爬取问题
嘿,作为Selenium新手碰到这种动态加载内容的坑太正常了,我来帮你拆解解决方案:
为啥你之前的方法不行?
你遇到的核心问题是:「Recommended Rating」是页面加载完成后,通过JavaScript动态渲染出来的。time.sleep(10)这种固定等待不够稳定(比如网络慢的时候,10秒可能还没加载完),而且你用的层级式CSS选择器太脆弱,页面布局一改动就失效;另外直接打印page_source拿到的是服务器返回的初始HTML,根本没包含动态生成的内容。
靠谱的解决步骤
1. 用「显式等待」替代固定sleep
别再用time.sleep()了,改用WebDriverWait等待元素真正加载完成,这是Selenium处理动态内容的标准操作:
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 # 初始化浏览器 driver = webdriver.Chrome() driver.get('https://finance.yahoo.com/quote/FB') try: # 最多等待20秒,直到目标元素可见 rating_element = WebDriverWait(driver, 20).until( EC.visibility_of_element_located( # 用更稳定的属性定位,这个data-test是前端专门留的标识,不容易变 (By.CSS_SELECTOR, 'div[data-test="rec-rating"] span') ) ) print(f"Recommended Rating: {rating_element.text}") finally: # 不管成功失败,最后都关闭浏览器 driver.quit()
2. 选对元素定位器
我用的div[data-test="rec-rating"] span比你之前的冗长选择器靠谱多了——这类data-test属性是前端为测试/爬虫预留的,不会随便改动,而你之前用的#Col2-4-QuoteModule-Proxy > div > section > div > div > div依赖页面层级,只要页面布局微调就会失效。
3. 确认元素位置的小技巧
以后找元素别用「查看源代码」,要打开Chrome的「开发者工具」(F12)切换到「Elements」面板,这里显示的是渲染后的实时DOM,你可以直接在里面搜索data-test="rec-rating",就能看到目标元素的真实结构。
4. 应对可能的反爬
如果还是拿不到内容,大概率是雅虎财经识别出你在用Selenium了,给Chrome加几个参数模拟正常浏览器就行:
from selenium import webdriver options = webdriver.ChromeOptions() # 禁用自动化识别 options.add_argument('--disable-blink-features=AutomationControlled') # 模拟正常用户代理 options.add_argument('--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') driver = webdriver.Chrome(options=options) driver.get('https://finance.yahoo.com/quote/FB') # 后面的等待和定位代码和之前一样
这样网站就不容易把你当成爬虫了。
内容的提问来源于stack exchange,提问作者PythonGeek
相关产品推荐
相关产品推荐

