使用Python BeautifulSoup爬取指定网页产品名称失败求助
解决动态页面产品抓取问题
你遇到的问题核心是这个页面的产品列表是JavaScript动态加载的——用requests直接获取的只是静态HTML骨架,产品数据还没被浏览器渲染出来,所以BeautifulSoup自然抓不到目标元素。另外你写的select语法也有问题,正确写法应该是mobile_page_soup.select('div.grid-items__item'),但这不是关键,关键是动态加载的内容无法通过静态请求获取。
下面给两种可行的解决方案:
方案一:用Selenium模拟浏览器渲染
Selenium能模拟真实浏览器加载页面,等JS执行完成后再抓取内容,步骤如下:
- 准备依赖
- 安装Selenium:
pip install selenium - 下载对应浏览器的驱动(比如Chrome的ChromeDriver),确保驱动路径能被Python识别
- 安装Selenium:
- 编写代码:
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 mobile_page_url = 'https://telenor.se/handla/mobiler/' # 初始化Chrome驱动 driver = webdriver.Chrome() driver.get(mobile_page_url) # 等待产品列表加载完成,最多等待10秒 wait = WebDriverWait(driver, 10) product_items = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, 'grid-items__item'))) # 提取并打印产品名称 for item in product_items: product_name = item.find_element(By.CLASS_NAME, 'product-card__name').text print(product_name) # 关闭浏览器 driver.quit()
方案二:直接请求产品数据API
动态页面的产品数据通常来自后端API,直接请求API比模拟浏览器更高效:
- 抓包找API:打开浏览器开发者工具(F12)→ 切换到「网络」标签→ 刷新页面→ 筛选「XHR/Fetch」请求,找到返回产品列表的接口(比如类似
/api/mobile-products的请求) - 编写请求代码:
import requests # 替换为你抓包得到的真实API地址 api_url = 'https://telenor.se/api/mobile-products' # 必要时添加请求头,比如从浏览器复制User-Agent、Referer等 headers = { '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' } response = requests.get(api_url, headers=headers) products = response.json() # 提取产品名称(字段名以API返回的JSON结构为准) for product in products: print(product.get('name'))
注意:API地址可能随网站更新变化,需要你自行确认;部分API需要携带特定请求头才能正常返回数据,可从浏览器的请求详情中复制对应参数。
内容的提问来源于stack exchange,提问作者Hadi Motlagh
相关产品推荐
相关产品推荐

