本文介绍的是自己做的淘宝秒拍的程序,有很多漏洞和需要完善的地方,只是做到了可以运行,未来可以继续优化!
1.搭建程序的思路
秒拍的底层逻辑就是依靠程序模拟人购买的行为,那么可以把搭建程序分为三个需要解决的问题:
1.如何让程序模拟人?
2.如何让程序购买?
3.如何防止“程序模拟人”这一操作被监测?
2.解决问题1:如何让程序模拟人?
这里需要运用到selenium,就是利用这个包,可以让计算机模拟人运行诸如Chrome等的浏览器。
具体安装细节就不赘述了,可以参考这篇文章。
需要注意:确保下载的Chrome webdriver版本与自己电脑上的Chrome版本一致!
下面是在python中的代码:
1 2 3
| from selenium import webdriver
browser = webdriver.Chrome()
|
此时Python中已经可以让程序模拟人的行为啦!
3.解决问题2:如何让程序购买?
下面就是简单的编写程序了,我分为了两部分。
第一部分:进入淘宝。
1 2 3 4 5 6 7 8
| from selenium import webdriver from selenium.webdriver.common.by import By
browser = webdriver.Chrome() browser.get("https://www.taobao.com/") browser.find_element(By.LINK_TEXT, "亲,请登录").click() print('请扫码登录!') browser.get('https://cart.taobao.com/cart.htm')
|
这一部分实现的功能是自动进入淘宝网站,自动进入登陆界面。此时需要自行扫码登录。之后自动进入购物车。
这里关于webdriver的语法有了更新,具体可以看这篇文章。
第二部分:选择需要购买的商品并购买。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| from selenium import webdriver from selenium.webdriver.common.by import By
if now > times: while 1==1: try: if browser.find_element(By.LINK_TEXT, '结 算'): print('here') browser.find_element(By.LINK_TEXT, '结 算').click() print(f'已经成功点击结算!') sleep(0.02) if browser.find_element(By.LINK_TEXT, '提交订单'): print('here') browser.find_element(By.LINK_TEXT, '提交订单').click() print(f'已经成功提交订单,请及时支付!') break break except: pass
|
这一部分首先需要手动选择商品,程序自动寻找结算按钮,并在预期时间前不断点击提交按钮。至于为什么不自动点击全选,在下面的章节会解释。
4.解决问题3:如何防止“程序模拟人”这一操作被监测?
为解决这一问题,首先需要明确,监测是如何实行的?其实我这个程序唯一想到的就是,网页加载的过程中,实际上是有先后的,但我们的程序是直接运行的,这就导致,并非程序没找到指定按钮,而是因为网页还没有加载出来而报错。为此考虑的解决办法是加入sleep函数(也需要导入包)。程序完善如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| from selenium import webdriver from time import sleep import time, datetime from selenium.webdriver.common.by import By
times = '2022-11-18 21:31:00' browser = webdriver.Chrome()
browser.get("https://www.taobao.com/")
time.sleep(3) browser.find_element(By.LINK_TEXT, "亲,请登录").click() time.sleep(3) print('请扫码登录!') time.sleep(5) browser.get('https://cart.taobao.com/cart.htm') time.sleep(5)
if now > times: while 1==1: try: if browser.find_element(By.LINK_TEXT, '结 算'): print('here') browser.find_element(By.LINK_TEXT, '结 算').click() print(f'已经成功点击结算!') sleep(0.02) if browser.find_element(By.LINK_TEXT, '提交订单'): print('here') browser.find_element(By.LINK_TEXT, '提交订单').click() print(f'已经成功提交订单,请及时支付!') break break except: pass
|
在这里做出两点说明:
1.browser.implicitly_wait(10)函数是webdriver内置函数,使用之后在全局的程序运行过程中都会延迟操作,不是很灵活;
2.对于为什么不直接让程序自己找到全选按钮,我在上面提供了两种方法,但是仍然没办法找到,会报告“element click intercepted”的错误,我找到了文章,但还没有细致研究,所以被迫改成了自己手动选择。
如果大家有好办法,可以给我留言呀!
5.整理代码
最后代码整理如下(唯一优化的是可以自定义购买时间)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| from selenium import webdriver from time import sleep import time, datetime from selenium.webdriver.common.by import By
def login(): browser.get("https://www.taobao.com/")
time.sleep(3) browser.find_element(By.LINK_TEXT, "亲,请登录").click() time.sleep(3) print('请扫码登录!') time.sleep(5) browser.get('https://cart.taobao.com/cart.htm') time.sleep(5)
def buy(times): while 1 == 1: now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') print(now)
if now > times: while 1 == 1: try: if browser.find_element(By.LINK_TEXT, '结 算'): print('here') browser.find_element(By.LINK_TEXT, '结 算').click() print(f'已经成功点击结算!') sleep(0.02) if browser.find_element(By.LINK_TEXT, '提交订单'): print('here') browser.find_element(By.LINK_TEXT, '提交订单').click() print(f'已经成功提交订单,请及时支付!') break break except: print('找不到结算按钮!')
if __name__ == '__main__': times = input('请输入抢购时间,格式例:2022-11-18 21:31:00----------请输入:') browser = webdriver.Chrome() login() buy(times)
|