使用Selenium爬取Glassdoor评论仅获第一页数据问题求助
问题分析
你遇到的核心问题是翻页后未等待新页面的评论内容加载完成就执行提取操作,导致每次提取的都是第一页的缓存元素;另外代码里存在重复初始化driver的冗余操作,也可能干扰页面状态。具体问题点:
- 重复初始化
driver,覆盖了之前的实例,可能导致页面状态异常 - 翻页后仅等待下一页按钮可点击,但未等待新的评论DOM元素加载完成,此时提取的还是前一页的元素(DOM未更新完成)
- 使用的
CLASS_NAME定位器结合:nth-child不够稳定,Glassdoor的页面元素class可能动态变化,翻页后DOM结构更新会导致定位失效
修正后的代码
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException, WebDriverException, StaleElementReferenceException from selenium.webdriver.chrome.options import Options import time import pandas as pd from selenium.webdriver.common.action_chains import ActionChains driver_path= r"C:\Users\TMaghsoudi\Desktop\chromedriver_win32.exe" # Chrome配置 options = webdriver.ChromeOptions() # options.add_argument("--start-maximized") options.add_argument('--ignore-certificate-errors') options.add_argument('--ignore-ssl-errors') options.add_experimental_option('excludeSwitches', ['enable-logging']) Pros =[] Cons=[] # 只初始化一次driver driver = webdriver.Chrome(driver_path, options=options) # 打开Glassdoor首页 url = "https://www.glassdoor.co.in/Job/index.htm" driver.get(url) time.sleep(3) driver.find_element(By.CLASS_NAME, "HeaderStyles__signInButton").click() time.sleep(5) Enter_email= driver.find_element(By.ID, "modalUserEmail") Enter_email.send_keys("XXXXXX") Enter_email.send_keys(Keys.ENTER) Enter_pass= driver.find_element(By.ID,"modalUserPassword") Enter_pass.send_keys("XXXXXX") SingIn= WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='d-flex align-items-center flex-column']/button[@class='gd-ui-button mt-std minWidthBtn css-1dqhu4c evpplnh0']"))) SingIn.click() time.sleep(5) driver.set_window_size(1120, 1000) driver.find_element(By.CLASS_NAME,"siteHeader__HeaderStyles__navigationItem:nth-child(2)").click() Company=driver.find_element(By.ID,"sc\.keyword") Company.send_keys("Amazon") Company.send_keys(Keys.ENTER) time.sleep(5) driver.find_element(By.CLASS_NAME, "px+ .module .reviews .eiHeaderLink").click() # 提取评论逻辑 for page in range(4): # 遍历4页,从第1到第4页 try: # 等待当前页的评论区块加载完成 WebDriverWait(driver, 20).until( EC.presence_of_all_elements_located((By.XPATH, "//div[contains(@class, 'v2__EIReviewDetailsV2')]")) ) # 提取Pros(优势):定位每个评论下的第一个fullWidth区块里的span pros_elements = driver.find_elements(By.XPATH, "//div[contains(@class, 'v2__EIReviewDetailsV2__fullWidth')][1]/span") for elem in pros_elements: text = elem.text.strip() if text: # 过滤空文本 Pros.append(text) # 提取Cons(劣势):定位每个评论下的第二个fullWidth区块里的span cons_elements = driver.find_elements(By.XPATH, "//div[contains(@class, 'v2__EIReviewDetailsV2__fullWidth')][2]/span") for elem in cons_elements: text = elem.text.strip() if text: Cons.append(text) # 如果不是最后一页,点击下一页 if page < 3: # 等待下一页按钮可点击 next_btn = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.CLASS_NAME, "nextButton")) ) # 滚动到下一页按钮位置 driver.execute_script("arguments[0].scrollIntoView(true);", next_btn) time.sleep(1) next_btn.click() # 等待页面跳转完成(URL变化或者新评论加载) WebDriverWait(driver, 20).until( EC.staleness_of(pros_elements[0]) # 等待前一页的元素失效,说明页面已更新 ) except StaleElementReferenceException: # 捕获元素过期异常,重新等待加载 WebDriverWait(driver, 20).until( EC.presence_of_all_elements_located((By.XPATH, "//div[contains(@class, 'v2__EIReviewDetailsV2')]")) ) except TimeoutException: print(f"第{page+1}页加载超时,跳过") break # 可选:保存到CSV df = pd.DataFrame({"Pros": Pros, "Cons": Cons}) df.to_csv("amazon_reviews.csv", index=False, encoding="utf-8-sig") driver.quit()
关键优化点
- 移除重复的
driver初始化,避免页面状态混乱 - 每次提取评论前,强制等待当前页的评论区块全部加载完成,确保提取的是当前页的最新内容
- 使用更稳定的
contains(@class, ...)XPath定位器,避免因class动态变化导致定位失效 - 翻页后等待前一页的元素失效(
staleness_of),确保页面完全更新后再进入下一次循环 - 增加空文本过滤,避免无效数据
- 用
execute_script滚动到下一页按钮,替代ActionChains,稳定性更高
内容的提问来源于stack exchange,提问作者Tahereh Maghsoudi
相关产品推荐
相关产品推荐

