Selenium爬虫无法翻页:仅能抓取烂番茄首页影评问题求助
解决烂番茄影评翻页抓取问题
问题分析
- 翻页采用AJAX异步加载,URL不会变化,原代码通过
current_url == url判断终止循环的逻辑完全错误,导致第一次点击下一页后直接退出。 - 下一页按钮的CSS选择器
rt-button.next定位不准确,需要用更稳定的方式。 - 未正确判断最后一页状态(下一页按钮会被禁用)。
修改方案
- 改用烂番茄官方标注的
data-qa属性定位下一页按钮,选择器为rt-button[data-qa="next-btn"],定位更稳定。 - 循环终止条件改为检查下一页按钮是否被禁用(存在
disabled属性),禁用则说明已到最后一页。 - 在headless模式下添加窗口大小参数,避免元素因视口过小无法加载。
修改后的代码
import time import pandas as pd from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options # 设置Chrome选项 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--headless") chrome_options.add_argument("--window-size=1920,1080") # 添加窗口大小,避免元素加载不全 # ChromeDriver路径 webdriver_service = Service(r"C:\Users\Brend\Videos\chromedriver_win32") # 初始化浏览器 driver = webdriver.Chrome(service=webdriver_service, options=chrome_options) url = "https://www.rottentomatoes.com/m/thor_love_and_thunder/reviews" driver.get(url) data = [] while True: # 抓取当前页影评 reviews = driver.find_elements(By.CSS_SELECTOR, 'div.review-row') for review in reviews: critic_name = review.find_element(By.CSS_SELECTOR, 'a.display-name').text.strip() publication = review.find_element(By.CSS_SELECTOR, 'a.publication').text.strip() review_quote = review.find_element(By.CSS_SELECTOR, 'p.review-text').text.strip() review_date = review.find_element(By.CSS_SELECTOR, 'span[data-qa="review-date"]').text.strip() score_icon = review.find_element(By.CSS_SELECTOR, 'score-icon-critic') state = score_icon.get_attribute('state') if score_icon else None review_data = { "Critic Name": critic_name, "Publication": publication, "Tomato Quality": state, "Review Quote": review_quote, "Review Date": review_date } data.append(review_data) try: # 等待下一页按钮可点击,使用data-qa属性定位 next_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'rt-button[data-qa="next-btn"]')) ) # 检查按钮是否被禁用,若禁用则退出循环 if next_button.get_attribute('disabled') is not None: break next_button.click() time.sleep(2) # 等待页面加载 except: # 捕获异常(比如按钮不存在),说明已到最后一页 break driver.quit() df = pd.DataFrame(data) df.to_csv('reviews_data.csv', index=False) print(df)
关键改动说明
- 新增
--window-size参数,确保headless模式下页面元素正常加载。 - 替换下一页按钮的CSS选择器为
rt-button[data-qa="next-btn"],利用官方标注属性提升稳定性。 - 循环终止逻辑改为检查按钮
disabled属性或捕获异常退出,适配AJAX翻页场景。
内容的提问来源于stack exchange,提问作者BeefyoftheSub
相关产品推荐
相关产品推荐

