You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium爬取亚马逊图书,字典列表生成重复累积问题排查

亚马逊巴西站Python图书爬取问题排查与修复

问题现象

爬取亚马逊巴西站Python相关图书时,期望生成每个元素为{TITLE:'书名', AUTHOR:'作者'}格式的字典列表,但实际输出的字典中,TÍTULO和AUTOR对应的列表会不断累积之前的内容,每次迭代重复包含已有的值。

错误原因

  • 无效循环导致重复追加:代码中lista = '//*[@id="search"]/div[1]/div[1]/div/span[1]'是一个字符串,for i in lista会遍历该字符串的每一个字符,导致内部的元素查找和数据追加逻辑被执行多次(次数等于字符串长度),每次都会把页面上所有的标题和作者重新追加到列表中,最终造成数据重复累积。
  • 元素定位范围过大://span[@class='a-size-base']的XPath会匹配页面中所有class为a-size-base的span元素,这些元素不止包含图书作者,还可能包含价格、评分等无关内容,导致作者列表混入无效数据。
  • 数据结构不符合需求:当前代码使用一个包含两个列表的大字典dic_livros,但用户需要的是每个图书对应一个独立字典的列表,结构不匹配。

修正后的代码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from time import sleep

# 初始化浏览器(使用webdriver-manager自动管理驱动,避免手动指定路径)
options = Options()
options.add_argument('window-size=1200,800')  # 调整窗口大小,确保元素正常加载
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
driver.implicitly_wait(5)

# 访问亚马逊巴西站并搜索Python图书
driver.get('https://www.amazon.com.br/')
search_box = driver.find_element(By.ID, "twotabsearchtextbox")
search_box.send_keys('python')
driver.find_element(By.ID, "nav-search-submit-button").click()
sleep(3)

# 提取图书信息,生成目标格式的字典列表
books_list = []
# 定位每个图书的容器,缩小元素查找范围
book_items = driver.find_elements(By.XPATH, "//div[@data-component-type='s-search-result']")

for item in book_items:
    book_dict = {}
    # 在当前图书容器内查找标题
    title_elem = item.find_elements(By.XPATH, ".//span[@class='a-size-base-plus a-color-base a-text-normal']")
    if title_elem:
        book_dict['TITLE'] = title_elem[0].text
    # 在当前图书容器内查找作者
    author_elem = item.find_elements(By.XPATH, ".//span[@class='a-size-base' and @dir='auto']")
    if author_elem:
        book_dict['AUTHOR'] = author_elem[0].text
    # 仅添加有标题的有效条目
    if book_dict:
        books_list.append(book_dict)

# 输出结果
for book in books_list:
    print(book)

driver.quit()

关键优化点

  • 移除无效循环:直接定位所有图书的容器元素,遍历每个容器处理单本图书的信息,避免重复执行查找逻辑。
  • 缩小元素定位范围:使用相对XPath(以.开头)在单个图书容器内查找标题和作者,确保只获取当前图书的对应信息,避免无关数据混入。
  • 调整数据结构:创建books_list列表,每遍历一本图书就生成一个独立字典并添加到列表中,符合用户期望的输出格式。
  • 优化驱动管理:使用webdriver-manager自动安装和管理ChromeDriver,无需手动指定驱动路径,提升代码兼容性。

内容的提问来源于stack exchange,提问作者Bruhlickd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:45:38