Python爬虫:用Beautiful Soup和Selenium按页码范围爬取多页数据无输出
问题原因及修复方案
核心问题定位
- 多类名选择器写法错误:BeautifulSoup通过
class属性匹配元素时,多个类名需用空格分隔,你代码中使用了CSS选择器的点分隔格式,导致无法匹配到任何元素,fetch_data始终为空列表,自然没有输出内容。 - 页码规则不匹配:亚马逊搜索结果的分页页码从1开始,
range(8)生成的是0-7的序列,page=0的页面无有效商品数据。 - 无页面加载等待:调用
driver.get()后未等待页面渲染完成就直接读取源码,大概率会拿到未加载完成的空白结构,无法匹配到目标元素。 - 元素取值逻辑错误:
find()方法返回的是标签对象,直接打印不会输出文本内容,且未做非空判断,后续元素匹配不到时会触发报错。
具体修复步骤
- 将所有class属性值中的
.替换为空格,符合BeautifulSoup的多类名匹配规则。 - 将页码循环范围改为
range(1,9),生成1-8的有效页码。 - 每次加载页面后增加至少3秒的等待时间,确保页面内容完全渲染。
- 提取商品名称时先判断元素是否存在,再调用
.text属性获取文本内容。
修正后可运行代码
from selenium import webdriver import time from bs4 import BeautifulSoup as Soup # 启动驱动 driver = webdriver.Firefox(executable_path='C://Downloads//webdrivers//geckodriver.exe') base_url = 'https://www.amazon.com/s?k=Mobile&i=amazon-devices&page=' # 页码从1到8 for page_num in range(1,9): driver.get(base_url + str(page_num)) # 等待页面加载完成 time.sleep(3) page_source = driver.page_source bs = Soup(page_source, 'html.parser') # 替换点为空格匹配多类名 fetch_data = bs.find_all('div', {'class': 's-expand-height s-include-content-margin s-latency-cf-section s-border-bottom'}) for f_data in fetch_data: # 替换点为空格匹配多类名 product_name = f_data.find('span', {'class': 'a-size-medium a-color-base a-text-normal'}) # 非空判断后输出文本 if product_name: print(product_name.text + '\n') # 运行完成后关闭驱动 driver.quit()
内容的提问来源于stack exchange,提问作者Bhavya Lodaya
相关产品推荐
相关产品推荐

