为何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
相关产品推荐
相关产品推荐

