如何修改Selenium代码实现Target商品全评论抓取(自动点击加载更多)
实现Target商品评论全量抓取(自动点击加载更多)
修改思路
要抓取所有评论,核心是循环定位并点击「加载更多」按钮,直到按钮不再显示(所有评论加载完成)。具体逻辑:
- 页面加载后滚动到评论区域,确保加载按钮可见
- 循环查找并点击加载按钮,每次点击后等待新评论加载完成
- 所有评论加载完毕后,统一抓取并保存数据
修改后的完整代码
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.chrome.service import Service as ChromeService from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC import configparser from datetime import datetime import time import json parser = configparser.RawConfigParser() parser.read('config.ini') url = parser['PROPERTIES']['URL'] OMIT_KEYWORDS = parser['FILTERS']['OMIT'].split(',') INCLUDE_KEYWORDS = parser['FILTERS']['INCLUDE'].split(',') END_DATE = datetime.strptime(parser['DATE']['END'], '%Y-%m-%d') START_DATE = datetime.strptime(parser['DATE']['START'], '%Y-%m-%d') minimum_comment_length = int(parser['PROPERTIES']['MIN_COMMENT_LENGTH']) maximum_comment_length = int(parser['PROPERTIES']['MAX_COMMENT_LENGTH']) # 配置Chrome驱动 options = webdriver.ChromeOptions() options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option("useAutomationExtension", False) CHROMEDRIVER_PATH = r'C:\Users\HP\Desktop\INTERNSHIP\Target\chromedriver.exe' service = ChromeService(executable_path=CHROMEDRIVER_PATH) driver = webdriver.Chrome(service=service, options=options) wait = WebDriverWait(driver, 20) try: driver.get(url) driver.implicitly_wait(10) time.sleep(2) # 滚动到页面底部,触发评论区加载 driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") time.sleep(1) # 循环点击「加载更多」按钮 while True: try: # 等待加载按钮可点击 load_more_btn = wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-test="load-more"]')) ) # 滚动到按钮位置,避免被页面元素遮挡 driver.execute_script("arguments[0].scrollIntoView(true);", load_more_btn) time.sleep(1) load_more_btn.click() # 等待新评论加载完成(通过按钮失效判断) wait.until(EC.staleness_of(load_more_btn)) time.sleep(2) except Exception: # 按钮不存在或无法点击时,退出循环 print("所有评论已加载完成,退出循环") break # 抓取所有评论数据 reviews = driver.find_elements(By.CSS_SELECTOR, ".styles__ReviewRow-sc-4u2mi2-1") item_list = [] for review in reviews: # 单条评论捕获异常,避免某条评论元素缺失导致程序崩溃 try: stars = review.find_element(By.CSS_SELECTOR, '.utils__ScreenReaderOnly-sc-1b93ups-0.dsPOPg').text.replace("out of 5 stars", "") username = review.find_element(By.XPATH, ".//span[contains(@data-test,'review-card--username')]").text title = review.find_element(By.XPATH, ".//h4[contains(@data-test,'review-card--title')]").text review_text = review.find_element(By.CSS_SELECTOR, '.h-margin-t-default.h-text-md').text except Exception as e: print(f"抓取单条评论失败: {e}") continue item = { 'stars': stars.strip(), 'username': username, 'userurl': "NA", 'title': title, 'review_text': review_text, 'permalink': "NA", 'reviewlocation': "NA", 'subproductname': "NA", 'subproductlink': "NA", } item_list.append(item) # 保存到JSON文件 print(f"共抓取到{len(item_list)}条评论") with open("output.json", "w", encoding='utf-8') as outfile: json.dump(item_list, outfile, ensure_ascii=False, indent=4) finally: # 确保浏览器资源被释放 driver.quit()
关键修改点说明
- 循环加载逻辑:
- 用
while True循环配合异常捕获,自动判断是否还有更多评论可加载 - 通过
staleness_of等待按钮失效,确保新评论完全加载后再进行下一次点击
- 用
- 元素定位优化:
- 替换Selenium旧版定位语法,使用Selenium 4推荐的
find_elements(By.XXX, ...)格式 - 单条评论加入异常处理,避免因个别评论元素缺失导致程序中断
- 替换Selenium旧版定位语法,使用Selenium 4推荐的
- 文件写入优化:
- 改用
w模式覆盖写入,避免原r+模式导致的文件内容错乱 - 添加
encoding='utf-8'和ensure_ascii=False,保证中文评论正常显示
- 改用
- 资源管理:
- 用
finally块确保浏览器一定会关闭,避免资源泄漏
- 用
注意事项
- 若Target页面更新元素选择器,需对应调整「加载更多」按钮和评论元素的定位符
- 可根据网络情况调整
time.sleep()的时长,平衡抓取效率和稳定性 - 频繁请求可能触发反爬,建议加入随机等待间隔降低风险
内容的提问来源于stack exchange,提问作者user16508648
相关产品推荐
相关产品推荐

