使用Python BeautifulSoup抓取IMDB全部影评 解决仅能获取25条的问题
问题原因
IMDB影评页默认单页仅返回25条静态渲染的内容,剩余影评需要点击「加载更多」按钮通过AJAX异步加载,你当前的代码仅抓取了第一页的静态HTML,因此只能获取到25条数据。
解决方法
推荐优先使用模拟AJAX请求的方案,无需启动浏览器,运行效率高,实现逻辑如下:
- 首先请求第一页影评页,提取当前页的所有影评,同时从页面的
load-more-data标签中提取分页参数paginationKey - 携带该参数请求IMDB的影评AJAX接口,获取下一页的影评数据与新的分页参数
- 循环上述步骤,直到返回的分页参数为空,即可获取全部影评
完整实现代码
import requests from bs4 import BeautifulSoup import time # 配置请求头,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Accept-Language": "en-US,en;q=0.9" } all_reviews = [] base_url = "https://www.imdb.com/title/tt6654210/reviews" next_pagination_key = None # 抓取第一页内容 response = requests.get(base_url, headers=headers) soup = BeautifulSoup(response.text, "html.parser") # 提取第一页影评 first_page_reviews = soup.select(".review-container") all_reviews.extend(first_page_reviews) # 提取第一页的分页key load_more_tag = soup.select_one(".load-more-data") if load_more_tag: next_pagination_key = load_more_tag.get("data-key") # 循环抓取剩余内容 while next_pagination_key: # 间隔1秒,避免触发反爬 time.sleep(1) ajax_url = f"{base_url}/_ajax?paginationKey={next_pagination_key}" ajax_response = requests.get(ajax_url, headers=headers) response_data = ajax_response.json() # 解析返回的影评HTML片段 ajax_soup = BeautifulSoup(response_data["html"], "html.parser") current_page_reviews = ajax_soup.select(".review-container") if not current_page_reviews: break all_reviews.extend(current_page_reviews) # 更新下一页的分页key,没有key就终止循环 next_pagination_key = response_data.get("paginationKey") print(f"共抓取到{len(all_reviews)}条影评")
注意事项
- 必须携带User-Agent请求头,否则IMDB会直接返回403拒绝访问
- 请求添加间隔时间,不要短时间高频请求,避免被IP封禁
- 爬虫仅可用于个人学习用途,遵守网站的robots协议与使用条款
内容的提问来源于stack exchange,提问作者Malvi Patel
相关产品推荐
相关产品推荐

