双十一已经过去很久了,但是在我心中还是有一个隐隐的痛,那就是没有抢到自己喜欢的东西,还是对自己20多年的手速太自信了,如果我当时使用了脚本来秒杀的话,应该会是另一番景象。所以,我痛定思痛,将淘宝秒杀的python代码贡献出来,请大家参考。
现在我们来明确一下我们的技术路径
- 我们使用Chrome浏览器的有头模式(主要是为了方便登录)。当然你也可以使用Headless模式,不过我一直没有验证成功。首先我们需要登录淘宝账号网址为 https://login.taobao.com/member/login.jhtml 弹出登录二维码之后需要通过扫码登录,我将登陆二维码马赛克处理了一下。为了保护我那为数不多的隐私。
- 你需要提前将商品加入购物车,登陆之后,可以直接勾选相应的商品,然后点击付款,点击提交订单等一系列操作。你也可以提前将购物车清空,只留下你想要买的商品,然后直接点击付款,提交订单等操作。
- 我添加的商品是华为mate20,如果你需要购买你其他商品,那么你就需要将对应的xpath更换为你的商品的xpath,我会在代码里面指出位置的
- 下面是代码,其中带 # 被注释掉的是Chrome的headless模式,如果你会使用滑块验证,那么你可以使用headless模式,这种模式更快,占用资源更少
from selenium import webdriver
from lxml import etree
#from selenium.webdriver.chrome.options import Options
import time
import datetime
#chrom_options = Options()
#chrom_options.add_argument('--headless')
#chrom_options.add_argument('--disable-gpu')
#driver = webdriver.Chrome(chrome_options=chrom_options)
#指定浏览器为Chrome浏览器
driver = webdriver.Chrome()
#窗体最大化
driver.maximize_window()
def login(url):
'''
这是登录模块,用于登录淘宝,并选中需要购买的商品的
:param url: https://login.taobao.com/构件/ login.jhtml
:return: 无
'''
#获取网页源信息
driver.get(url)
#等浏览器与Selenium完美契合之后再进行下一步动作
driver.implicitly_wait(10)
#等待10秒
time.sleep(10)
#查找购物车按钮的xpath并点击进入购物车
driver.find_element_by_xpath('//*[@id="mc-menu-hd"]/span[2]').click()
#等待4秒
time.sleep(4)
#勾选你需要购买的物品,这里勾选的是华为mate20.反正我也没钱买,不如直接给你们做个示范
driver.find_element_by_xpath('//*[@id="J_Item_951817163433"]/ul/li[1]/div/div/label').click()
#等待5秒
time.sleep(5)
def buy_good(buy_time):
'''
登录页面之后,这个程序就一直循环读取当前的系统时间,如果到了开始秒抢的时间,立马启动程序开始提交订单
:param buy_time: 给定的秒抢时间
:return: 无
'''
#一直循环读取系统时间,等待秒强开始
while True:
#读取系统当前时间
now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
#是否到可以购买的时间了
if now_time == buy_time:
try:
#“//*[@id="J_Go"]/span”是我添加的商品你的xpath,你需要更换为你需要的商品的xpath,否则爬虫会失败
#这一句是判断,是否可以购买了
if driver.find_element_by_xpath('//*[@id="J_Go"]/span'):
# 点击立即购买按钮
driver.find_element_by_xpath('//*[@id="J_Go"]/span').click()
# 点击提交订单按钮
driver.find_element_by_xpath('//*[@id="submitOrder_1"]/div/a[2]').click()
# 然后你就可以输入密码进行支付了
#结束循环
break
except:
time.sleep(1)
print(now_time)
time.sleep(1)
if __name__ == "__main__":
url = 'https://login.taobao.com/member/login.jhtml'
login(url=url)
buy_good('2018-11-29 14:23:13')