本文介绍的是自己做的淘宝秒拍的程序,有很多漏洞和需要完善的地方,只是做到了可以运行,未来可以继续优化!

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

# 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')

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.implicitly_wait(10)
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)

# 全选购物车
# while 1 == 1:
# if browser.find_element(By.LINK_TEXT,'全选'):
# browser.find_element(By.LINK_TEXT,'全选').click()
# # browser.find_element(By.XPATH,'//*[@id="J_SelectAll1"]'):
# # browser.find_element(By.XPATH,'//*[@id="J_SelectAll1"]').click()
# break
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)