使用BeautifulSoup爬取烂番茄单部电影全部影评的问题咨询
问题原因
- 烂番茄影评页属于动态加载页面,初始渲染仅返回前19条影评,更多内容需要用户向下滚动时,浏览器通过AJAX异步请求加载后续数据,直接爬取初始HTML只能拿到首批内容
- 你当前的代码本身也存在语法问题:
- 调用逻辑缩进错误,
url定义和后续函数调用写在了findReviews的return语句之后,永远不会执行 - 变量名大小写不统一,定义的小写
url,传参用了大写URL
- 调用逻辑缩进错误,
解决方案
这里给你提供两种可行方案:
方案1:模拟浏览器滚动加载全量内容
使用Selenium自动化工具模拟用户滚动操作,触发所有影评加载完成后再提取内容,代码兼容性高、易上手。
首先安装依赖:
pip install selenium beautifulsoup4 pandas webdriver-manager
完整可运行代码:
from bs4 import BeautifulSoup import pandas as pd import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager def scrape_all_reviews(url, scroll_pause_time=2): # 初始化Chrome浏览器 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) driver.get(url) # 记录初始页面高度 last_height = driver.execute_script("return document.body.scrollHeight") while True: # 滚动到页面最底部触发加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待接口返回、内容渲染完成 time.sleep(scroll_pause_time) # 对比滚动前后的页面高度,高度无变化说明已经加载完所有影评 new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break last_height = new_height # 拿到完整页面源码解析 soup = BeautifulSoup(driver.page_source, "html.parser") driver.quit() # 提取所有影评(优化了你的原有提取逻辑,无需遍历所有div) reviews = [ele.text.strip() for ele in soup.find_all("div", class_="the_review")] return pd.DataFrame(reviews, columns=['reviews']) if __name__ == "__main__": target_url = "https://www.rottentomatoes.com/m/interstellar_2014/reviews" reviews_df = scrape_all_reviews(target_url) print(reviews_df) # 可自行保存到本地:reviews_df.to_csv("interstellar_reviews.csv", index=False)
方案2:直接调用AJAX接口拿数据
可以打开浏览器F12开发者工具的「网络」面板,筛选XHR请求,滚动页面时就能看到加载影评的异步接口,直接构造请求拿接口返回的JSON数据即可,该方案无需启动浏览器,运行效率更高。
注意事项
- 控制请求/滚动频率,避免短时间高频请求被网站限制IP
- 爬取内容仅限个人学习使用,请勿商用或批量传播
内容的提问来源于stack exchange,提问作者YonahJ
相关产品推荐
相关产品推荐

