一年一度的“双十一”又要来了,很多人已经开始摩拳擦掌,毕竟几天之后手还在不在就不好说了。

各种社交软件也是跟着遭殃,整天就是“来帮我一起盖楼”,各种字体绕过屏蔽,什么奇葩的脑洞也出来了:

不过也感谢这些电商平台,让多年未联系的好友、加过但没有对话的陌生人都找到了打破尴尬的话题。(让场面更加尴尬)

月薪上万的白领们为了2块5毛钱的优惠券起早贪黑,也是堪称人类迷惑行为大赏了……

问题是,你以为自己真的赚到了?

商品“明降暗升”的传言早有耳闻:很多商品在双十一之前早早地把价格调高,加上优惠之后也不过就是跟以前的原价相当。让不知情的消费者在心理上感觉占了便宜。

这个传言是不是真的,很好判断,只要定期去访问商品页面,记录价格就可以。不过一般人也没闲工夫这么去做。于是,我们用 Python 做了一个可以定时监控商品的小工具,可以帮你监控想要关注的商品。

工具完成之后,我们随机挑选了几个商品作为测试,结果就有一个中招了……(真的是随便选的):

这款保暖背心产品,之前标价 39.9元,到11月之后却突然调价为 49.9元,并标注上了“双11狂欢价”,也就是原价……

商品价格监控

实现功能

  • 输入天猫、苏宁、京东、拼多多(网页页面 http://yangkeduo.com/)任一商品链接,不是口令。请复制选择好商品配置的页面链接,即返回相应商品价格,并保存到文件。商品页面若有团购与单独购买两个价格,返回团购价格。
  • 使用 Windows 任务计划或 Linux 定时任务,定时执行程序。获取不同时段的商品价格信息。
  • 单独运行画图程序,可根据定时任务获取的数据,生成商品价格时间变化折线图。
  • 程序监测的两件商品截图如下,具体文件在 pic 文件夹下 bnbx.html、kyy.html,推荐本地查看。


    简单的商品查看页面 https://htmlpreview.github.io/?https://raw.githubusercontent.com/spiderbeg/price_monitor/master/search/search.html 。输入查询商品关键词,选择商城,即可查看相应商城商品列表。默认为苏宁。效果图如下。注意:点击后请等待一段时间即可,请勿频繁刷新。

运行环境

  • python3.7
  • Windows
  • jupyter notebook

运行依赖包

  • requests
  • pyecharts
  • beautifulsoup4

项目思路

部分问题回答

项目的大致思路流程:

  • 第一步:使用商品详细页链接获取商品信息与商品价格,并保存获取数据 时间、商品介绍,价格 到 csv 文件中;
  • 第二步:使用定时任务定时执行第一步完成的程序;
  • 第三步:读取前两步获取到的时间、商品介绍、价格数据。使用 pyecharts 绘制绘制商品价格时间变化折线图。

为什么不使用 pc 端来调试网页,获取价格信息?

因为在未登录状态天猫的详细商品页的信息是虚假的,同时从移动端网页入手,可以降低调试难度。

谷歌浏览器如何开启手机调试模式?

F12 进入开发者模式,然后鼠标点击一下,具体见下图,包括后文的查找价格接口信息。

实现代码

test.py

  • 测试商品链接是否能够成功获取到商品价格。
import timing
"""1 调用 timing.py 中的 go 方法测试链接的可用性2 调用 timing.py 中的 go, get_url() 方法测试 goods.csv 文件中链接的可用性python学习交流群:1136201545更多学习资料可以加群获取
"""# 链接测试
# urls = ['https://m.suning.com/product/0000000000/000000011210599174.html?utm_source=baidu&utm_midium=brand-wuxian&utm_content=&utm_campaign=title&safp=f73ee1cf.wapindex7.113464229882.4&safc=prd.1.rec_14-40_0_A_ab:A',
# 'https://m.suning.com/product/0070067092/000000000188392234.html?utm_source=baidu&utm_midium=brand-wuxian&utm_content=&utm_campaign=title&safp=f73ee1cf.wapindex7.113464229882.60&safc=prd.1.rec_5-5_1018C,1014C$c3ae37eafeb814a098d120647449da6f_H_ab:A',
# 'https://m.suning.com/product/0000000000/000000000107426461.html?src=snsxpd_none_recssxcnxhq_1-3_p_0000000000_000000000107426461_rec_21-65_3_A&safp=f73ee1cf.71jyzx.112079032536.4&safc=prd.1.rec_21-65_3_A',
# 'https://m.suning.com/product/0000000000/10606656136.html?safp=f73ee1cf.phone2019.121927933306.2&safc=prd.0.0']# 输入文本的链接可用性测试
if __name__ == '__main__':urls = timing.get_url()for url in urls:try:timing.go(url) # 获取返回信息 except BaseException as e:print(url,'\n',e)

timing.py

  • 进行定时抓取任务时,运行的文件。
# encoding:utf8
import time
import os
import re
import csv
from shop.jd import JD # 自定义
from shop.tm import TM
from shop.sn import SN
from shop.pdd import PDD
from apscheduler.schedulers.blocking import BlockingScheduler
'''
python学习交流群:1136201545更多学习资料可以加群获取
'''
# import logging
# formats = "%(asctime)s %(name)s %(levelname)s function:%(funcName)s -> :%(message)s"
# logging.basicConfig(format=formats, datefmt='%m/%d/%Y %I:%M:%S %p') # ,handlers=[logging.FileHandler(log_path, 'a+', 'utf-8')]
# LOGGER = logging.getLogger(__name__)
# LOGGER.setLevel(logging.INFO)basePath = os.path.dirname(os.path.abspath(__file__)) # 当前文件夹def get_date():"""获取日期"""timestamp = int(time.time())time_local = time.localtime(timestamp) # #时间戳 转 时间数组dt = time.strftime("%Y-%m-%d %H:%M:%S",time_local) # #时间数组 转 新的时间格式(2016-05-05 20:28:54)return dtdef get_url():"""读取商品链接返回:图像名,商品名,商品链接 元组"""urls = []with open(os.path.join(basePath, 'goods.csv'),'r',encoding='utf8') as f:f_csv = csv.reader(f)next(f_csv) # 返回标题,直接到内容for row in f_csv: # 内容if row:urls.append(row)return urlsdef go(url):'''输入:链接输出:(时间,标题,商品价格), 文件路径 元组统一价格输出,以最低价格为标准,如有团购和单独购买以单独购买为准'''result = re.findall('://(.+?).com', url[2])if result:result = result[0]if 'yangkeduo' in result:pd = PDD(url[2])title,price = pd.main()elif 'suning' in result:sn = SN(url[2])title,price = sn.main()elif 'tmall' in result or 'taobao' in result:tm = TM(url[2]) # 605030977928:联想笔记本 ; 603330883901 华为 mate30 pro ; 523962011119: 酸奶 title,price = tm.main()elif 'jd' in result:jd = JD(url[2]) # 测试 id:100009083152 商品:联想 y9000x 笔记本电脑 2 热水壶 or 薯条?title,price = jd.main()else:raise TypeError('请检查输入的网站链接')print('%s 标题 %s, 价格(多个价格以团购为准) %s. '%(result,title,price))else:raise TypeError('请检查输入是否为目标网站的商品详细页面链接')# 文件名replace_string = ['.',' ',r'/',r'\\']for rs in replace_string:url[1] = url[1].replace(rs,'_')path = os.path.join(os.path.join(basePath, 'data'), url[1]+'.csv')today = get_date() # 日期return (today, title, price),pathdef addData(row, path):"""数据写入文件"""with open(path,'a+',encoding='utf8') as f:fieldnames = ['时间', '标题','价格']writer = csv.DictWriter(f, fieldnames=fieldnames)if f.tell() == 0: # 如果内容为空则添加标题writer.writeheader()writer.writerow({'时间': row[0], '标题': row[1],'价格':row[2]})def main():"""运行程序"""urls = get_url()for url in urls:try:row,path = go(url) # 获取返回信息 addData(row,path) # 写入文件except BaseException as e:print('请求问题?报错:%s'%e)if __name__ == '__main__':print('时间',get_date())main()# scheduler = BlockingScheduler()# scheduler.add_job(go,'cron', args=[url],hour='8-23', minute= '5,35' , second='15')# # scheduler.add_job(main,'cron', args=[3088512],hour='8-23', minute= 5 , second='15')# print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))# try:#     scheduler.start()# except (KeyboardInterrupt, SystemExit):#     pass

draw.py

  • 图像文件生成在 pic 文件中。
# encoding: utf8from pyecharts import options as opts
from pyecharts.charts import Page, Line
import os
import csv
'''
python学习交流群:1136201545更多学习资料可以加群获取
'''
basePath = os.path.dirname(os.path.abspath(__file__)) # 当前文件夹def line(title,checktime,price) -> Line:"""绘图函数"""c = (Line().add_xaxis(checktime).add_yaxis(title, price, is_smooth=True).set_global_opts(title_opts=opts.TitleOpts(title="商品价格"),yaxis_opts=opts.AxisOpts(name="元/台"),xaxis_opts=opts.AxisOpts(name=title,axislabel_opts=opts.LabelOpts(formatter="{value}", font_size=12, rotate=30,) # x,y 轴标签)))return cdef files():"""输出字典,每一个键值代表一张图表"""global basePathfiles = {}with open(os.path.join(basePath,'goods.csv'),'r',encoding='utf8') as f:f_csv = csv.reader(f)next(f_csv) # 标题for row in f_csv: # 内容if row:replace_string = ['.',' ',r'/',r'\\'] # 特殊字符处理for rs in replace_string:row[1] = row[1].replace(rs,'_')files.setdefault(row[0],[]).append(row[1])return filesdef draw(files):"""绘制图形文件"""datapath = os.path.join(basePath,'data')picpath = os.path.join(basePath,'pic')for k,i in files.items():page = Page()for n in i:try:with open(os.path.join(datapath, n +'.csv'),'r', encoding='utf8') as f:f_csv = csv.DictReader(f)price,checktime = [],[]for row in f_csv:checktime.append(row['时间'])price.append(row['价格'])title = npage.add(line(title,checktime,price)) # 24 发帖回帖变化图、近3月变化图、浏览、回复散点图except:print('未制图:',n)page.render(os.path.join(picpath, k +'.html'))if __name__ == '__main__':draw(files())

Python实现商品价格监控,识破双十一的套路相关推荐

  1. 淘宝天猫京东拼多多苏宁抖音等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)

    淘宝京东拼多多苏宁抖音等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)代码对接如下: 1.公共参数 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼 ...

  2. 淘宝天猫京东拼多多抖音苏宁1688等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)

    淘宝天猫京东拼多多抖音苏宁1688等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)代码对接如下: 1.公共参数 名称 类型 必须 描述 key String 是 调用key(必须以 ...

  3. 淘宝天猫京东拼多多等平台关键词监控价格API接口(店铺商品价格监控API接口代码对接展示)

    淘宝天猫京东拼多多抖音苏宁1688速卖通亚马逊淘特等平台关键词监控价格API接口(店铺商品价格监控API接口调用展示)代码对接如下: 1.公共参数 名称 类型 必须 描述 key String 是 调 ...

  4. 商品价格监控接口,超详细的介绍

    一.电商平台商品价格监测API接口,天猫商品价格监控接口,京东商品价格监控接口,政采云商品价格监控接口,拼多多商品价格监控接口,接口数据分析接口. 1.接口背景:电商平台的定价监管是很多品牌面临的一个 ...

  5. 淘宝天猫京东拼多多抖音苏宁1688等平台商品详情调用(店铺商品价格监控API接口调用展示)

    淘宝天猫京东拼多多抖音苏宁1688等平台商品详情调用(店铺商品价格监控API接口调用展示)代码对接如下 商品详情调用: item_get-获得淘宝商品详情 测试 请求参数 请求参数:num_iid=5 ...

  6. python 京东 价格监控_price-monitor-php 京东价格监控提醒用户抢购

    price-monitor-php 简介 该为旧版本备份,除特殊情况,不再更新.新版采用flask+sqlite+requests,功能更完善 新版项目地址:点我 核心爬虫代码项目地址:点我 功能:京 ...

  7. 商品价格监控API接口,详情介绍

    一.电商平台商品价格监测API接口,天猫商品价格监控接口,京东商品价格监控接口,政采云商品价格监控接口,拼多多商品价格监控接口,接口数据分析接口. 1.接口背景:电商平台的定价监管是很多品牌面临的一个 ...

  8. 实例代码分享Python实现Linux监控

    本文通过实例代码给大家介绍了Python实现Linux监控的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下. 工作原理:基于/proc 文件系统 Linux 系统为管理员提供了非常好的方 ...

  9. python实现网络监控_使用python进行服务器监控

    使用python进行服务器监控 Linux服务器中,一切皆为文件.也就是说服务器运行的各种信息,其实是可以从某些文件中查询得到: Linux系统中,有一个/proc的虚拟文件系统 Linux 系统为管 ...

最新文章

  1. 在JDK 6和JDK 7的substring()方法的区别?
  2. 勒索病毒一周记:它让我们得到了什么经验教训?
  3. java ug二次开发_使用Java进行UG二次开发:简单的例子(上) | 学步园
  4. mysql5.7二进制包安装
  5. python拟合曲线误差分析_python曲线拟合不能给出合理的拟合结果
  6. 更精炼更专注的RTMPClient客户端EasyRTMPClient,满足直播、转发、分析等各种需求...
  7. 新型数据中心需要什么样的存储
  8. 实现多线程的几种方式
  9. 从零开始学前端:上节课案例+break,continue以及while和do while --- 今天你学习了吗?(JS:Day5)
  10. int n引发的中断应用——编写中断7CH的中断例程
  11. 杰出的橙色网站设计案例
  12. win10 两台电脑之间共享桌面及共享文件(手把手教学)
  13. 黑马程序员——一些常用类的代码实践
  14. RuntimeError: Exporting the operator affine_grid_generator to ONNX opset version 9 is not supported.
  15. 配置vscode解决code runner乱码
  16. 敏捷团队的病与药——阿里健康医药B2B团队敏捷转型手记
  17. html中如何修改表格标题栏,如何设置css中表格标题caption标签的位置
  18. PATA1142 Maximal Clique(测试点2、3)
  19. 动力锂离子电池电池检测标准和方法
  20. 【JY】有限单元分析的常见问题及单元选择

热门文章

  1. 世界上最难弹奏的十首钢琴曲
  2. 解决Win10/11有线网(包括校园网)频繁掉线问题
  3. 某型无人机群的监视覆盖任务航路规划
  4. 2021年普宁华侨中学高考成绩查询,普宁英才华侨中学2019高考成绩喜报、本科重本上线人数情况...
  5. 金砖国家智慧城市建设案例
  6. 计算机网络面试《葵花宝典》
  7. 完美解决安装MySQL Install/Remove of the Service Denied!错误解决办法
  8. 【报告分享】2020美好城市指数:短视频与城市繁荣关系白皮书(附下载)
  9. 11个精美网页——Web前端开发技术课程大作业,期末考试,Dreamweaver简单网页制作
  10. JavaScript深入系列-冴羽博客读后总结