使用Requests与BeautifulSoup无法获取正确商品折扣价求助
解决Checkers网站抓取折扣价不一致的问题
嘿,这个问题我碰到过好多次啦!你遇到的情况是典型的静态请求和动态渲染的差异——浏览器里<span class="now">显示的R17.59是页面加载完成后通过JavaScript动态渲染出来的,但requests只会获取服务器返回的初始HTML,不会执行页面里的JS,所以拿到的是原价R21.99。
下面给你几个靠谱的解决思路:
1. 直接抓取后端API(推荐)
电商网站大多会用后端接口返回商品数据,再用JS渲染到页面上。你可以通过浏览器开发者工具找到这个数据源:
- 打开浏览器F12切换到「Network」标签,刷新页面
- 过滤「XHR/Fetch」请求,找和商品列表、价格相关的接口(通常是JSON格式)
- 复制这个接口的URL、请求头(尤其是
User-Agent、Referer,避免被反爬拦截) - 用
requests直接请求这个API,就能拿到包含折扣价的原始数据了
举个简化的代码示例:
import requests # 替换成你找到的真实请求头和API地址 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', 'Referer': 'https://www.checkers.co.za/c-2256/All-Departments?q=%3Anovelty&page=0' } api_url = "https://www.checkers.co.za/xxx/api/products" response = requests.get(api_url, headers=headers) products = response.json() # 从返回的JSON里提取折扣价,具体字段看API返回结构 for product in products: print(f"折扣价: {product['price']['discounted']}")
2. 使用无头浏览器执行JS
如果网站没有单独的API接口,那就只能用能模拟浏览器执行JS的工具,比如selenium或playwright。这里用selenium举个例子:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 无头模式运行,不弹出浏览器窗口 options = Options() options.add_argument('--headless=new') driver = webdriver.Chrome(options=options) # 目标页面URL url = 'https://www.checkers.co.za/c-2256/All-Departments?q=%3Anovelty&page=0' driver.get(url) # 等待页面加载完成,确保折扣价元素已经渲染 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'now'))) # 提取所有商品的折扣价 price_elements = driver.find_elements(By.CLASS_NAME, 'now') for elem in price_elements: print(f"当前显示价格: {elem.text.strip()}") driver.quit()
注意事项
- 别频繁请求网站,设置合理的请求间隔,避免触发反爬机制被封禁IP
- 有些网站的API可能需要携带特定的Cookie或参数,记得在开发者工具里仔细核对
- 电商网站的接口和页面结构可能会不定期更新,要定期检查你的爬虫是否还能正常工作
内容的提问来源于stack exchange,提问作者Jak
相关产品推荐
相关产品推荐

