周一至周五 09:00 - 18:00(UTC+08:00) ©2026 NST LABS TECH LTD. 保留所有权利。
Lena Zhou Growth & Integration Specialist
在Python中进行自动价格跟踪:完整指南
TL;DR
生产价格跟踪器需要收集、提取、标准化、存储、比较、调度和警报。打印一个 CSS 选择器的脚本仅仅是提取步骤。
存储显示的价格文本和标准化的十进制数。原始文本证明了页面所示内容;十进制数支持安全比较。
当定期产品页面收集需要 JavaScript 渲染、重试、代理编排或截屏时,请使用 Nstproxy Crawl 。您的 Python 代码仍应验证页面身份并解析所需字段。
绝不要将失败的提取翻译成“缺货”或零价格。将收集失败保留为单独的状态,并仅在验证的观察结果上发出警报。
在 Python 中自动价格跟踪:生产形态
自动价格跟踪器是一个小型数据管道:定时 URL → 验证的页面工件 → 标准化的观察 → 历史数据库 → 变化规则 → 通知 。Nstproxy Crawl 可以处理定期的网络获取层;Python 负责目标配置、解析、比较和警报策略。
免费试用 Nstproxy →
本教程使用 SQLite,因为它内置于 Python 中,透明,并且适合单个进程或小服务。当多个工作者需要并发写入时,迁移到服务器数据库,但保持相同的表格和状态转换。目标不是逃避访问控制。仅收集您被授权访问的网站和页面,遵循适用的条款和法律,并保持请求频率成比例。
方法 1:定义目标和观察
步骤 1:创建目标配置
每个目标需要的不仅仅是一个 URL。存储一个稳定的目标 ID、预期主机名、产品身份、区域、货币预期、提取规则和收集计划。如果一个产品有变体,明确表示每个被跟踪的变体。
TARGETS = [
{
"id"
:
"demo-item"
,
"url"
:
"https://example.com/product/demo-item"
,
"host"
:
"example.com"
,
"price_selector"
:
"[data-testid='price']"
,
"currency"
:
"USD"
,
}
]
单靠 URL 是不安全的,因为重定向、同意页面、区域商店和更改的默认变体都可能产生看似合理的价格。如果您正在跟踪市场,还需记录卖家和履行状态。
步骤 2:创建一个仅附加的观察表 每次收集合并一个新行。不要覆盖之前的价格;变更检测和调试需要历史记录。Python 的 sqlite3 文档 描述了参数化查询和事务行为。
import sqlite3
SCHEMA = """
CREATE TABLE IF NOT EXISTS observations (
id INTEGER PRIMARY KEY,
target_id TEXT NOT NULL,
retrieved_at TEXT NOT NULL,
source_url TEXT NOT NULL,
status TEXT NOT NULL,
price_text TEXT,
price_value TEXT,
currency TEXT,
evidence TEXT,
error TEXT
);
CREATE INDEX IF NOT EXISTS idx_target_time
ON observations(target_id, retrieved_at DESC);
"""
def open_db ( path = "prices.sqlite3" ) :
connection = sqlite3 . connect ( path )
connection . executescript ( SCHEMA )
return connection
将十进制值存储为文本可以避免二进制浮点数的意外。将它们解析为 Decimal 进行比较。如果多个工作者可能收集同一目标,请添加唯一的运行 ID。
方法 2:可靠地收集产品页面
步骤 1:请求渲染的 HTML 静态 requests.get() 对于简单的服务器渲染页面已经足够,但许多产品价格在 JavaScript 执行后出现或依赖于位置。以下函数使用文档记录的 Nstproxy 同步终端。实时调用需要 NSTPROXY_API_KEY;因此,代码经过语法验证和文档化的模式,凭证作为先决条件记录。
import os
import requests
CRAWL_ENDPOINT = "https://api.nstproxy.com/api/v1/crawl/scrape/submit-sync"
def fetch_page ( url : str ) - > dict :
response = requests . post (
CRAWL_ENDPOINT ,
headers = { "x-api-key" : os . environ [ "NSTPROXY_API_KEY" ] } ,
json = {
"url" : url ,
"formats" : [ "html" , "screenshot" ] ,
"onlyMainContent" : False ,
"timeout" : 60000 ,
} ,
timeout = 90 ,
)
response . raise_for_status ( )
task = response . json ( ) [ "data" ]
if task . get ( "status" ) != "completed" or not task . get ( "success" ) :
raise RuntimeError ( f"collection failed: { task } " )
return task [ "data" ]
该Crawl API指南 还记录了用于批量和截图的异步任务,以作为视觉证据。针对大型目录,请异步提交工作,限制每个主机的并发性,并应用抖动,而不是在同一秒内启动每个URL。
步骤 2:验证页面身份 如果页面的最终主机名、标题、语言环境、产品ID或期望的标记与目标不匹配,则拒绝该页面。单独检测同意页面、不可用区域页面和机器人挑战。HTTP 200仅表示返回了响应。
该亚马逊抓取指南 讨论了一个特别多变的电子商务目标,但这个教训普遍适用:地理位置、变体和会话状态改变了“价格”的含义。
方法 3:解析和标准化价格
步骤 1:提取显示的值 当嵌入的机器可读产品数据准确表示所选变体时,优先使用该数据。否则,使用稳定的DOM选择器。保留定性词,如“起始于”、“会员专用”、“需要优惠券”、“含税”或“分期付款定价”。
import re
from bs4 import BeautifulSoup
from decimal import Decimal , InvalidOperation
def parse_price ( html : str , selector : str ) - > tuple [ str , Decimal ] :
soup = BeautifulSoup ( html , "html.parser" )
node = soup . select_one ( selector )
if node is None :
raise ValueError ( f"price selector not found: { selector } " )
text = " " . join ( node . get_text ( " " , strip = True ) . split ( ) )
match = re . search ( r"(?:\d{1,3}(?:,\d{3})*|\d+)(?:\.\d{1,2})?" , text )
if not match :
raise ValueError ( f"no decimal price in: { text !r } " )
try :
value = Decimal ( match . group ( 0 ) . replace ( "," , "" ) )
except InvalidOperation as exc :
raise ValueError ( f"invalid price: { text !r } " ) from exc
return text , value
此解析器故意处理美国风格的十进制格式。对于欧洲格式,请编写特定于区域的解析器和单元测试。不要通过通用的正则表达式删除标点;1.299,00和1,299.00会被错误解读。
步骤 2:显式存储成功和失败 from datetime import datetime , timezone
def save_observation ( db , target , status , * , price_text = None , price_value = None ,
evidence = None , error = None ) :
db . execute (
"""INSERT INTO observations
(target_id, retrieved_at, source_url, status, price_text,
price_value, currency, evidence, error)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)""" ,
(
target [ "id" ] , datetime . now ( timezone . utc ) . isoformat ( ) , target [ "url" ] ,
status , price_text , str ( price_value ) if price_value is not None else None ,
target [ "currency" ] , evidence , error ,
) ,
)
db . commit ( )
使用如accepted、fetch_failed、wrong_page和parse_failed等状态。该词汇防止仪表板将数据的缺失视为价格事件。要获取更完整的管道设计,请参见数据分析师的Python库 ,尤其是获取和分析之间的分离。
可靠地收集新鲜的产品价格
在您的 Python 跟踪器中使用 Nstproxy Crawl 来获取呈现的产品页面、重试、代理编排和屏幕截图证据。
开始跟踪
https://example.com/article
爬取
方法 4:检测有意义的变化
步骤 1:仅比较已接受的观察结果 阅读同一目标和货币的最新两行已接受的结果。忽略其间的失败,但分别报告过时的数据。比较 Decimal 值并保留警报的原始字符串。
from decimal import Decimal
def latest_change ( db , target_id : str ) :
rows = db . execute (
"""SELECT retrieved_at, price_text, price_value, source_url
FROM observations
WHERE target_id = ? AND status = 'accepted'
ORDER BY retrieved_at DESC LIMIT 2""" ,
( target_id , ) ,
) . fetchall ( )
if len ( rows ) < 2 :
return None
newest , previous = rows
new_value , old_value = Decimal ( newest [ 2 ] ) , Decimal ( previous [ 2 ] )
if new_value == old_value :
return None
return {
"old" : str ( old_value ) , "new" : str ( new_value ) ,
"difference" : str ( new_value - old_value ) ,
"observed_at" : newest [ 0 ] , "source_url" : newest [ 3 ] ,
"displayed" : newest [ 1 ] ,
}
步骤 2:应用警报政策 并不是每个变化都值得通知。政策可以要求绝对或百分比阈值、目标价格、最低信心或在连续两次运行中的确认。使用基于目标 ID、旧值、新值和观察时间的键来去重警报。
在可用时发送源 URL、显示文本、先前值、检索时间和屏幕截图引用。绝不要发送与其变体和地区分离的未解释数字。
方法 5:计划和监控跟踪器 使用 cron、云调度程序或应用程序调度程序。APScheduler 的 官方用户指南 涉及间隔和 cron 风格的触发器。确保只有一个调度程序拥有目标分区,或者使用带有幂等性键的队列。
根据业务延迟和来源波动选择频率。监控接受页面速率、字段完整性、变更收益、警报精度、过时目标计数和 p95 收集延迟。接受页面速率下降应在产生误导性的业务警报之前通知操作员。
缓存未更改的工件或哈希并避免不必要的下游处理。当在一个网站上跟踪多个 URL 时,使用有界并发和退避。网络抓取 IP 轮换 解释了为什么会话和目标行为应该指导身份策略。
测试清单
单元测试十进制格式、销售文本、缺失元素和限定词。
为正常、不可用、同意和重新设计状态保存 HTML 夹具。
测试重定向和错误的区域设置。
验证数据库永远不会将失败的收集存储为零。
确认重复调度程序运行不会发送重复警报。
在任何人对通知采取行动之前运行一个影子时期。
每当范围发生变化时,审查网站权限和请求频率。
最终裁决 在 Python 中自动化价格跟踪的可靠方法是将页面获取和价格提取视为分开的、可观察的阶段。存储仅附加的证据,仅比较已验证的观察结果,并围绕商业重要性设计警报规则,而不是围绕每一个文本更改。
接下来,实施五个具有代表性的目标,运行几天而不发送通知,并标记每一次拒绝。当 JavaScript 渲染、重试、代理处理或屏幕截图证据否则会成为您团队的浏览器维护项目时,请使用 Nstproxy Crawl 。
常见问题 这取决于来源、管辖权、数据、访问方法和合同限制。审查条款、访问控制、相关的机器人指令和适用法律;对于重要的部署,获取法律建议。
问:Python 价格跟踪器应该使用 Selenium 吗?
仅在需要浏览器交互而简单的获取无法执行时才使用。管理爬虫可以减少浏览器操作;对于允许的静态页面,直接 HTTP 足够了。
只需根据业务决策的要求和来源的许可来运行。增加频率之前,测量变更收益和接受页面速率。
文本保留了货币、限定词和显示证据。标准化的十进制支持比较,但无法证明一个值是否仅限会员、分期付款或以“从”开头。
Aug. 27th 2026
立即访问住宅、数据中心、IPv6 与 ISP 高质量代理池。 创建免费账号并立即试用 ->