日常遇到一些商品比较抢手的情况,经常无库存。所以总希望能够监控它的库存,并在有库存的时候进行提醒。那以某伊份为例,尝试基于Python的Selenium模块的监控方法。
01
什么是Selenium
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Perl等不同语言的测试脚本。
Selenium框架底层是使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。使用简单,可使用Java,Python等多种语言编写用例脚本,使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
Selenium优点:模拟真实用户对浏览器进行操作。
Selenium缺点:啰嗦,一步错,步步错,需要加各种条件约束。
02
步骤及分析
2.1 提取商品链接地址
首先需要找到商品的链接地址,毕竟要用浏览器去访问。某伊份虽然是app端,但也可以通过各种分享的骚操作拿到地址。
2.2 分析商品详情页中的关键词
比如库存数量,售罄等字眼,及其所在的元素位置。再复制出相应的选择器路径或xpath等,看个人喜好。
如这个的“已售罄”提示文本的xpath路径是:
//*[@id="app"]/div[2]/div/div[2]/ul/li[1]/div[1]/div[2]/span[2]
2.3 整理思路及步骤
这次要监控3个商品,思路如下:
打开页面→设定监控间隔→切换页面→刷新→获取关键词→切换页面→刷新→获取关键词→...→有货通知
2.4 其余补充
2.4.1 登录cookies暂先手动保存,通过代码置入浏览器中;
2.4.2 可选有头或无头模式,节省资源占用。有头就是看得到浏览器,无头就是看不到,但功能正常运行。
03
效果及代码
3.1 代码:
用push+做推送;
用os模块做简单输入控制,选择有头或无头;
用bro.add_cookie(),将手动抓取的cookies置入浏览器;
用几个变量记录监控到的有货次数,超过6次停止监控。
from selenium.webdriver import ChromeOptions
import time,os,json,requests
from selenium import webdriver
from urllib import parse
p_token= ''#push+
print("开始运行")
options = ChromeOptions()#设置
options.add_argument('--window-size=300,300')#设置窗口大小
h = input('输入1开启无头模式,输入任意内容关闭无头模式:')
if h == "1":
options.add_argument('--headless') # 无头模式
print("启用 无头模式")
else:
print("关闭 无头模式")
bro = webdriver.Chrome(options= options)#按设置创建浏览器
bro.get("https://m.laiyifen.com/citylife/lifeProDetail?channelSkuUnitId=115812******")#商品1
bro.delete_all_cookies()# 首先清除由于浏览器打开已有的cookies
with open('cookies_1.txt', 'r') as f: #cookies_1.txt在py源码目录下
cookies_list = json.load(f)# 使用json读取cookies 注意读取的是文件 所以用load而不是loads
for cookie in cookies_list:
if isinstance(cookie.get('expiry'), float):
cookie['expiry'] = int(cookie['expiry'])
bro.add_cookie(cookie)
bro.get("https://m.laiyifen.com/citylife/lifeProDetail?channelSkuUnitId=115812*****")# 重新发送请求(这步是非常必要的,要不然携带完cookie之后仍然在登录界面)
time.sleep(1)
bro.execute_script('window.open("https://m.laiyifen.com/citylife/lifeProDetail?channelSkuUnitId=11581*****");') #商品2
time.sleep(1)
bro.execute_script('window.open("https://m.laiyifen.com/citylife/lifeProDetail?channelSkuUnitId=11581*******");') #商品3
handles = bro.window_handles #获取标签句柄
n = 1 #循环次数
ddok = 0 #有货次数
yhok = 0 #有货次数
hmok = 0 #有货次数
while True:
i = 0
for i in range(3):
bro.switch_to.window(handles[i])#切换标签,实际标签第一个为0,第二个为2,第三个为1
bro.refresh()
#print(i)
time.sleep(3)
try:#正常运行下面代码
r = bro.find_element_by_xpath('''//*[@id="app"]/div[2]/div/div[2]/ul/li[1]/div[1]/div[2]/span[2]''').text
if r == "已售罄":
if i == 0:
print("dd 已售罄")
elif i == 1:
print("yh 已售罄")
else:
print("hm 已售罄")
elif str(r).find("库存") != -1:
if i == 0:
ddok = ddok + 1
print("dd 有货")
if ddok <= 2:
t = str(time.time())
content = parse.quote_plus(t) # url编码
title = parse.quote_plus('dd 有货') # url编码
requests.get(f'http://www.pushplus.plus/send?token={p_token}&title={title}&content={content}')
elif i == 1:
yhok = yhok + 1
print("yh 有货")
if yhok <= 2:
t = str(time.time())
content = parse.quote_plus(t) # url编码
title = parse.quote_plus('yh 有货') # url编码
requests.get(f'http://www.pushplus.plus/send?token={p_token}&title={title}&content={content}')
else:
hmok = hmok + 1
print("hm 有货")
if hmok <= 2:
t = str(time.time())
content = parse.quote_plus(t) # url编码
title = parse.quote_plus('hm 有货') # url编码
requests.get(f'http://www.pushplus.plus/send?token={p_token}&title={title}&content={content}')
else:
if i == 0:
print("dd 已售罄")
elif i == 1:
print("yh 已售罄")
else:
print("hm 已售罄")
except Exception:# 产生错误时运行的代码,Exception是一个类
print('异常,未获取到数据')
i = i + 1
print(f"已运行{n}次")
if 叮咚ok >= 6: # 提醒了6次就结束循环
print("已监控到6次,结束运行")
break
n = n + 1
bro.quit()
input('输入回车后继续:')
def ck_save():#保存cookies
with open('cookies_1.txt', 'w') as f:
# 将cookies保存为json格式
f.write(json.dumps(bro.get_cookies()))
3.2 有头模式运行效果:
3.3 无头模式运行效果:
动图跟3.1比起来没有浏览器,只有日志输出,就不录了。
这是之前第一次拿Selenium写的代码,供参考。原文链接:
https://mp.weixin.qq.com/s?__biz=Mzk0NzQyMTcwNw==&mid=2247483985&idx=1&sn=40828476bd58c3a3a54cc26521f55b6c&chksm=c3765535f401dc23d4667e028692a0a4eeb79ec561e3430335896faaea715174c81d9e2775bc&token=165543763&lang=zh_CN#rd
- End -
更多精彩文章文章来源:https://www.toymoban.com/news/detail-653576.html
vxin关注【偶尔敲代码】文章来源地址https://www.toymoban.com/news/detail-653576.html
到了这里,关于监控商品库存方法之一——Selenium的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!