如何用BeautifulSoup 4抓取Script标签中的商品价格?
解决Digikala商品价格抓取问题
问题原因
Digikala采用React框架渲染页面,初始请求返回的HTML中<div id="__next">是空的,实际页面内容由JavaScript动态生成。商品价格数据并非直接嵌入DOM,而是存储在页面的<script>标签内的JSON结构中,所以直接用BeautifulSoup解析初始HTML无法获取到价格。
解决方案1:解析页面内的JSON数据(轻量推荐)
直接提取页面中存储商品初始数据的<script>标签,解析其中的JSON内容获取价格:
from bs4 import BeautifulSoup import requests import json url = "https://www.digikala.com/product/dkp-722339/%DA%A9%D8%AA%D8%A7%D8%A8-%D9%85%D8%BA%D8%A7%D8%B2%D9%87-%D8%AE%D9%88%D8%AF%DA%A9%D8%B4%DB%8C-%D8%A7%D8%AB%D8%B1-%DA%98%D8%A7%D9%86-%D8%AA%D9%88%D9%84%DB%8C/" r = requests.get(url) soup = BeautifulSoup(r.content, "html.parser") # 定位包含商品初始数据的script标签 script_tag = soup.find("script", string=lambda t: t and "__initialData__" in t) if script_tag: # 提取并格式化JSON字符串 raw_json = script_tag.string.split("window.__initialData__ = ")[1].rstrip(";") product_data = json.loads(raw_json) # 从JSON结构中提取售价(字段路径可能随网站更新变化,需验证) selling_price = product_data["product"]["pricing"]["sellingPrice"] print(f"商品售价:{selling_price} 伊朗里亚尔") else: print("未找到存储商品数据的script标签")
- 无需模拟浏览器,请求速度快
- 若网站更新了数据存储的变量名(比如
__initialData__变更),需要调整代码中的匹配关键词
解决方案2:用Selenium模拟浏览器渲染(稳定兼容)
如果网站的JSON数据结构频繁变化,可使用Selenium模拟完整浏览器加载,直接获取渲染后的DOM元素:
from selenium import webdriver from selenium.webdriver.common.by import By import time # 初始化浏览器驱动(需提前安装对应浏览器的driver,比如ChromeDriver) driver = webdriver.Chrome() driver.get(url) time.sleep(2) # 等待页面JS加载完成 # 通过CSS选择器定位价格元素(选择器需根据页面实际结构调整) price_element = driver.find_element(By.CSS_SELECTOR, ".c-product-price__value") print(f"商品售价:{price_element.text}") driver.quit()
- 需要安装Selenium和对应浏览器的驱动程序
- 速度较慢,但能适配JS动态渲染的复杂场景
内容的提问来源于stack exchange,提问作者MohammadAli Mazaheri
相关产品推荐
相关产品推荐

