You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python requests获取的按钮文本与手动浏览网页显示不一致?

问题描述

我想给心仪的T恤做个简单的库存检查器,目标链接是:https://yesfriends.co/products/mens-t-shirt-black?variant=40840532689069。手动浏览时按钮显示「Coming Soon」,库存充足时会显示「Add To Cart」。我打算用requests和BeautifulSoup定位<button>标签读取文本,当文本变成「Add To Cart」时触发通知,但运行代码后返回的按钮文本却是「Add To Cart」,和网页实际显示不符。

我的代码:

import requests
import bs4

URL = 'https://yesfriends.co/products/mens-t-shirt-black?variant=40840532689069'


def check_stock(url):
    page = requests.get(url)
    soup = bs4.BeautifulSoup(page.content, "html.parser")
    buttons = soup.find_all('button', {'name': 'add'})
    return buttons


if __name__ == '__main__':
    buttons = check_stock(URL)
    print(buttons[0].text)

解决方案

问题根源

你遇到的问题是因为页面按钮状态是JavaScript动态渲染的:requests只能获取服务器返回的原始HTML,而浏览器会执行页面中的JS代码,根据实际库存状态动态修改按钮文本和可用性。原始HTML里的按钮默认文本就是「Add To Cart」,JS加载完成后才会根据库存情况替换成「Coming Soon」。

两种解决思路

思路1:用Selenium模拟浏览器渲染

Selenium可以模拟真实浏览器加载页面并执行JS,能获取到和手动浏览一致的最终页面内容:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

URL = 'https://yesfriends.co/products/mens-t-shirt-black?variant=40840532689069'

def check_stock(url):
    # 初始化Chrome浏览器(需提前安装对应版本的chromedriver)
    driver = webdriver.Chrome()
    driver.get(url)
    # 等待页面JS加载完成
    time.sleep(2)
    # 定位目标按钮
    button = driver.find_element(By.NAME, 'add')
    button_text = button.text.strip()
    driver.quit()
    return button_text

if __name__ == '__main__':
    text = check_stock(URL)
    print(text)
    if text == 'Add To Cart':
        print('库存已上架!')
        # 此处可添加通知逻辑(如邮件、桌面弹窗等)

思路2:直接调用Shopify变体API(推荐)

该网站基于Shopify搭建,Shopify提供了公开的产品变体信息API,无需渲染页面就能直接获取准确的库存状态:

import requests

# 变体ID对应URL中的variant参数:40840532689069
VARIANT_API_URL = 'https://yesfriends.co/products/mens-t-shirt-black/variants/40840532689069.json'

def check_stock():
    response = requests.get(VARIANT_API_URL)
    variant_data = response.json()
    if variant_data['available']:
        print('库存已上架!')
        # 此处可添加通知逻辑
    else:
        print('Coming Soon')

if __name__ == '__main__':
    check_stock()

这种方法效率更高,无需依赖浏览器,直接通过API获取最准确的库存状态。

内容的提问来源于stack exchange,提问作者Liam Gower

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:18:13