使用Selenium爬取亚马逊时出现TypeError: 'function' object is not iterable求解决
解决Selenium爬取亚马逊数据时的TypeError问题
错误根源
代码里的核心问题有两个:
- Expected Conditions使用错误:
EC.presence_of_all_elements_located是构造等待条件的工具函数,不能直接赋值给变量。直接调用它只会返回一个函数对象,而非可迭代的元素列表,所以for item in items会触发TypeError: 'function' object is not iterable。 - CLASS_NAME选择器误用:
By.CLASS_NAME不支持同时传入多个类名(比如s-result-item sasin),多个类名需要用CSS选择器写成.s-result-item.sasin。
修复步骤
- 用
WebDriverWait(已导入为wait)配合EC.presence_of_all_elements_located等待并获取元素列表,这是该工具的正确使用方式。 - 将多类名查询替换为CSS_SELECTOR格式。
- 修正其他逻辑错误:比如
find_element返回单个元素,不能用!= []判断是否存在,改用find_elements(返回列表,可通过长度判断)或捕获NoSuchElementException异常处理元素缺失情况。
完整修正代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait as wait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.service import Service from selenium.common.exceptions import NoSuchElementException web = 'https://www.amazon.com' driver_path = r'V:\Python Project\chromedriver_win32\chromedriver.exe' # 加r避免转义问题 options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--disable-gpu') # 无头模式适配参数 s = Service(driver_path) driver = webdriver.Chrome(service=s, options=options) # 启用无头模式 driver.maximize_window() driver.implicitly_wait(30) driver.get(web) keyword = "Table" search = driver.find_element(By.ID, "twotabsearchtextbox") search.send_keys(keyword) search_button = driver.find_element(By.ID, 'nav-search-submit-button') search_button.click() product_asin = [] product_name = [] product_price = [] product_ratings = [] product_ratings_num = [] product_link = [] # 正确等待并获取商品元素列表 items = wait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".s-result-item.sasin")) ) for item in items: # 获取商品名称 try: name = item.find_element(By.CSS_SELECTOR, ".a-size-medium.a-color-base.a-text-normal") product_name.append(name.text) except NoSuchElementException: product_name.append("N/A") # 获取ASIN data_asin = item.get_attribute("data-asin") product_asin.append(data_asin if data_asin else "N/A") # 获取价格 try: whole_price = item.find_element(By.CLASS_NAME, "a-price-whole").text fraction_price = item.find_element(By.CLASS_NAME, "a-price-fraction").text price = f"{whole_price}.{fraction_price}" except NoSuchElementException: price = "0" product_price.append(price) # 获取评分和评论数 try: ratings_box = item.find_elements(By.CSS_SELECTOR, ".a-row.a-size-small span") if len(ratings_box) >= 2: ratings = ratings_box[0].get_attribute('aria-label') ratings_num = ratings_box[1].get_attribute('aria-label') else: ratings, ratings_num = "0", "0" except NoSuchElementException: ratings, ratings_num = "0", "0" product_ratings.append(ratings) product_ratings_num.append(str(ratings_num)) # 获取商品链接 try: link = item.find_element(By.CSS_SELECTOR, ".a-link-normal.a-text-normal").get_attribute("href") product_link.append(link) except NoSuchElementException: product_link.append("N/A") driver.quit() # 输出爬取结果 print("商品名称:", product_name) print("ASIN:", product_asin) print("价格:", product_price) print("评分:", product_ratings) print("评论数:", product_ratings_num) print("商品链接:", product_link)
额外说明
- 加入异常捕获,避免单个元素缺失导致程序崩溃。
- 路径前加
r解决转义字符问题。 - 启用无头模式(若需可视化窗口,可去掉
options=options参数)。 - 遵循Selenium规范,用CSS_SELECTOR处理多类名查询。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

