使用BeautifulSoup爬取谷歌应用商店时find_all返回空列表问题求解
问题原因
你遇到的问题核心是目标评论元素为JavaScript动态渲染产物,不存在于requests请求获取的初始静态HTML中。
你在浏览器开发者工具中看到的d15Mdf bAhLNe类对应的div,是页面加载完成后,浏览器执行JS脚本异步请求评论数据、动态插入到DOM里的。你用requests.get仅能拿到页面首次返回的原始HTML,没有执行后续JS渲染的步骤,因此soup对象中根本不存在目标元素,find_all自然返回空列表。
你提到“已经成功抓取到完整HTML文件”属于误判,你可以直接在打印的soup文本中搜索d15Mdf字符串,是完全匹配不到的,你在浏览器中看到的完整DOM结构和requests拿到的原始HTML并非同一内容。
额外补充:写法错误说明
你尝试的soup.find_all({class : d15Mdf bAhLNe})写法本身不符合BeautifulSoup语法规范,多类匹配的正确写法有两种:
- 字符串直接写全类名:
soup.find_all('div', class_="d15Mdf bAhLNe")(也就是你最开始的写法,本身没有语法问题) - 列表传多个类:
soup.find_all('div', class_=["d15Mdf", "bAhLNe"])
解决方案
方案1:使用支持JS渲染的爬虫工具
可以选用Selenium、Playwright等模拟浏览器运行的工具,等待页面JS执行完成、评论元素渲染后再提取内容,参考示例代码:
from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 初始化浏览器驱动,需提前配置对应浏览器的驱动文件 driver = webdriver.Chrome() driver.get('https://play.google.com/store/apps/details?id=com.google.android.googlequicksearchbox&hl=en') # 等待评论元素加载完成,最长等待10秒 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "d15Mdf")) ) # 获取渲染完成的页面源码 html_text = driver.page_source soup = BeautifulSoup(html_text, 'lxml') reviews = soup.find_all('div', class_="d15Mdf bAhLNe") print(reviews) # 关闭浏览器 driver.quit()
注:如果需要爬取更多评论,还需要额外添加模拟页面滚动的逻辑,触发更多评论的加载请求。
方案2:直接调用评论接口
打开浏览器开发者工具的「网络」面板,筛选Fetch/XHR请求,滚动页面触发评论加载时,就能抓到谷歌应用商店官方的评论异步接口,直接请求该接口获取JSON格式的评论数据,这种方式效率远高于解析HTML页面。
内容的提问来源于stack exchange,提问作者almogTovim
相关产品推荐
相关产品推荐

