使用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
相关产品推荐
相关产品推荐

