熟悉使用Webdriver ---- 商品自动秒杀

Posted merlin&

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了熟悉使用Webdriver ---- 商品自动秒杀相关的知识,希望对你有一定的参考价值。

前几天下载了Webdriver模块,经过简单的研究,发现这个模块可以做很多有意思的事情,下面我就用一个实例来理解webdriver的此处操作(完整代码在文章末尾)。

*浏览器:谷歌chrome浏览器

*预先安装模块:selenium模块,Webdriver(不会安装请看我的上一条博客)

*编程语言:Python

首先观察正常购物流程(以京东商城为例)

打开京东网址(www.jd.com)→点击登录→选择账号密码登录→输入账号密码→打开购物车,选择想要购买的物品→点击去结算→付款购买

1.首先导入第三方模块,指定webdriver位置

1 from selenium import webdriver
2 import time
3 
4 #将账号密码赋给变量name、password
5 password = \'京东密码\'
6 name = \'京东账号\'
7 #指定webdriver位置
8 driver = webdriver.Chrome(\'/home/chromedriver\')

2、打开京东网址

driver.get(\'https://www.jd.com/\')

3.点击登录选项

首先将鼠标移动至登录选项,右击检查

发现可以根据文字内容定为到选项

 

#点击登录选项
driver.find_element_by_link_text(\'你好,请登录\').click()

 

 4.进入登录界面,自动输入账号密码,登录账号

 右击检查,发现<账户登录>选项可以通过文本定位,<账号输入框><密码输入框>分别由name属性进行定位,<登录>使用ID进行定位

1 #点击账户登录
2 driver.find_element_by_link_text(\'账户登录\').click()
3 #输入账号密码
4 driver.find_element_by_id(\'loginname\').send_keys(num)
5 driver.find_element_by_id(\'nloginpwd\').send_keys(pwd)
6 #点击登录键
7 driver.find_element_by_id(\'loginsubmit\').click()
8 #延时5s
9 time.sleep(5)

 

 

 在我们点击登录之后,可能会出现一个滑块验证的环节,此环节可以用机器学习的方法自动通过验证,但是由于现在只是熟悉webdriver操作,可使用手动操作通过验证。

即在点击<登录>之后,添加延时 time.sleep(5) 并在5s之内通过滑块验证

5.点击购物车,勾选想要购买的物品,点击付款

购物车可以通过文本定位

driver.find_element_by_link_text(\'我的购物车\').click()

 

然后要勾选要下单的物品,点击去结算

勾选框我使用的是谷歌浏览器的xpath helper插件来进行定位,结算键可以同样使用文本来定位

#使用xpath语法定位复选框
driver.find_element_by_xpath("/html[@class=\' jd_retina\']/body/div[@id=\'container\']/div[@class=\'cart-warp\']/div[@class=\'w\']/div[@id=\'jd-cart\']/div[@class=\'cart-main cart-main-new\']/div[@id=\'cart-list\']/div[@id=\'cart-item-list-01\']/div[@id=\'vender_8888\']/div[@class=\'item-list\']/div[@id=\'product_promo_50077743033\']/div[@id=\'product_100008492922\']/div[@class=\'item-form\']/div[@class=\'cell p-checkbox\']/div[@class=\'cart-checkbox\']/input[@class=\'jdcheckbox\']").click()
#点击去结算
driver.find_element_by_link_text(\'去结算\').click()

 

 此时若直接使用之前的定位方法来勾选和结算,代码运行后会报错,这是因为点击我的购物车之后,打开了一个新的网页,但是代码执行的默认网页还是在www.jd.com

所以程序找不到我们定位的位置,所以会提示错误

该段的正确代码是

#保存初始网页
wnhandle = driver.current_window_handle
#点击我的购物车
driver.find_element_by_link_text(\'我的购物车\').click()
#保存打开的所有网页
all_handle = driver.window_handles
#遍历保存的网页
for handle in all_handle:
        #判断当前打开的网页是否为初始网页
       if handle != wnhandle:
       #若为新打开的网页,则切换到新网页
           driver.switch_to.window(handle)
#设置延时
time.sleep(2)
#勾选复选框
driver.find_element_by_xpath("/html[@class=\' jd_retina\']/body/div[@id=\'container\']/div[@class=\'cart-warp\']/div[@class=\'w\']/div[@id=\'jd-cart\']/div[@class=\'cart-main cart-main-new\']/div[@id=\'cart-list\']/div[@id=\'cart-item-list-01\']/div[@id=\'vender_8888\']/div[@class=\'item-list\']/div[@id=\'product_promo_50077743033\']/div[@id=\'product_100008492922\']/div[@class=\'item-form\']/div[@class=\'cell p-checkbox\']/div[@class=\'cart-checkbox\']/input[@class=\'jdcheckbox\']").click()
#点击结算
driver.find_element_by_link_text(\'去结算\').click()

 

6.封装函数 

 将以上函数封装到模块中,方便调用

def login_in(self,num,pwd):

 

7.定义模块调用

def run_driver(self,num,pwd):
     self.login_in(num,pwd)

 

 

完整代码 

 1 from selenium import webdriver
 2 import time
 3 
 4 name = \'账号\'
 5 password = \'密码\'
 6 
 7 #指定webdriver位置
 8 driver = webdriver.Chrome(\'/home/jmhao/chromedriver\')
 9 #打开京东网址
10 driver.get(\'https://www.jd.com/\')
11 
12 class pay:
13     #登录模块
14     def login_in(self,num,pwd):
15         driver.find_element_by_link_text(\'你好,请登录\').click()
16         time.sleep(1)
17         driver.find_element_by_link_text(\'账户登录\').click()
18         time.sleep(1)
19         driver.find_element_by_id(\'loginname\').send_keys(num)
20         driver.find_element_by_id(\'nloginpwd\').send_keys(pwd)
21         time.sleep(1)
22         driver.find_element_by_id(\'loginsubmit\').click()
23         time.sleep(5)
24         wnhandle = driver.current_window_handle
25         driver.find_element_by_link_text(\'我的购物车\').click()
26         all_handle = driver.window_handles
27         for handle in all_handle:
28             if handle != wnhandle:
29                 driver.switch_to.window(handle)
30         time.sleep(2)
31         driver.find_element_by_xpath("/html[@class=\' jd_retina\']/body/div[@id=\'container\']/div[@class=\'cart-warp\']/div[@class=\'w\']/div[@id=\'jd-cart\']/div[@class=\'cart-main cart-main-new\']/div[@id=\'cart-list\']/div[@id=\'cart-item-list-01\']/div[@id=\'vender_8888\']/div[@class=\'item-list\']/div[@id=\'product_promo_50077743033\']/div[@id=\'product_100008492922\']/div[@class=\'item-form\']/div[@class=\'cell p-checkbox\']/div[@class=\'cart-checkbox\']/input[@class=\'jdcheckbox\']").click()
32         driver.find_element_by_link_text(\'去结算\').click()
33 
34     #运行
35     def run_driver(self,num,pwd):
36         self.login_in(num,pwd)
37 
38 
39 if __name__ == \'__main__\':
40     jd = pay()
41     jd.run_driver(name, password)

 

此段代码只到结算步骤,只供熟悉webdriver操作使用

 

以上是关于熟悉使用Webdriver ---- 商品自动秒杀的主要内容,如果未能解决你的问题,请参考以下文章

实现高并发秒杀的 7 种方式,写的太好了,建议收藏!!

竞拍系统设计(秒杀系统知识迁移)

竞拍系统设计(秒杀系统知识迁移)

秒杀方案

使用Redis+MQ+MySql实现商品秒杀

python秒杀脚本安全吗