如何用Python+Selenium完整爬取亚马逊50个电视类畅销品名称?
亚马逊畅销电视页面全量爬取解决方案
问题核心
亚马逊畅销列表采用动态加载机制,前30个元素初始渲染,剩余20个需要滚动页面触发后端加载。直接滚动到底或固定sleep可能因加载时机不匹配导致元素未找到。
可行方案
1. 渐进式滚动+显式等待
通过循环滚动页面,每次滚动后等待元素加载,直到获取到50个标题:
- 用集合存储标题避免重复(页面可能重复渲染元素)
- 显式等待替代固定sleep,确保元素加载完成再提取
2. 代码实现
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化浏览器,配置User-Agent模拟真实请求 options = webdriver.ChromeOptions() options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=options) # 打开目标页面 driver.get("https://www.amazon.com/Best-Sellers-Electronics-Televisions/zgbs/electronics/172659") driver.maximize_window() target_count = 50 titles = set() while len(titles) < target_count: # 滚动到当前页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待页面加载(可根据网络情况调整) time.sleep(2) try: # 显式等待所有标题元素加载完成 title_elements = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".zg-item .p13n-sc-truncate")) ) # 提取标题文本并去重 for elem in title_elements: title_text = elem.text.strip() if title_text: titles.add(title_text) except Exception as e: print(f"加载失败: {str(e)}") break # 输出结果 final_titles = list(titles)[:target_count] print(f"成功获取 {len(final_titles)} 个产品标题:") for idx, title in enumerate(final_titles, 1): print(f"{idx}. {title}") driver.quit()
3. 优化技巧
- 精准滚动触发:如果直接滚到底无效,可滚动到当前最后一个元素位置,强制触发加载:
items = driver.find_elements(By.CSS_SELECTOR, ".zg-item") if items: last_item = items[-1] driver.execute_script("arguments[0].scrollIntoView({block: 'end'});", last_item) - 反爬规避:增加随机等待时间(
time.sleep(random.uniform(1,3))),避免固定间隔被识别;不要频繁运行脚本,防止IP被限制。
内容的提问来源于stack exchange,提问作者Harsha
相关产品推荐
相关产品推荐

