Python+Webdriver实现淘宝、京东等抢单操作

        最近双十一已经到了,笔者为了拓展技术水平研究了一下网络爬虫技术,其中双十一给人印象最深刻地就是抢单了,“爬虫学的好,监狱进得早”。本着学术和技术研究的态度,笔者仅使用了普通商品进行测试操作,不进行盈利活动。

0.引言

         抢单操作其含义在于到达预定时间,使得我们电脑控制浏览器自动完成相关过程。

        因此可以调用python 的selenium包可以实现与浏览器交互,但目前浏览器厂商未直接支持webdriver,因此我们还需要下载诸如 chromedriver.exe(chrome)等浏览器驱动供python调用。

        小编以淘宝网为例,脚本最终可直接进入付款界面,证明了这条技术路线是可行高效的,但最终触发了淘宝的支付异常,不得不说支付宝在这方面做的还是很牛的,所以写下这篇博客权当技术研究记录。

1.准备工作

设备:一台可以上网的计算机

软件:操作系统、浏览器

编程语言:Python

2.下载并导入selenium包

        使用pip命令即可简单高效地下载并安装selenium包,我们可从官网下载各个浏览器的驱动程序(.exe),为了方便起见,直接将驱动exe文件放入代码目录下即可。

3.编写代码

        小编也是借鉴网络上大佬们发布的相关代码,但随着selenium的最近一次更新,很多网络上的代码已经不能用了,并且这些代码比较基础简单,交互性不够好,因此本人也做了一些改进。

3.1首先导入各种库

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import datetime

3.2实现各种功能

1.webdriver初始化

option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')
driver = webdriver.Chrome(options=option)

2.跳转到指定网站 

def get_url(self):
        global driver
        driver.get(self.__base_url)

3.登录淘宝

def login(self):
        global driver
        if driver.find_element(By.XPATH,'//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]'):
            driver.find_element(By.XPATH,'//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]').click()
            driver.find_element(By.XPATH,'//*[@id="login"]/div[1]/i').click()#点击扫码登陆
            
            while True:
                try:
                    if driver.find_element(By.XPATH,'//*[@id="J_SiteNavLogin"]/div[1]/div/a'):
                        driver.get("https://cart.taobao.com/cart.htm")
                        print("跳转成功!")
                        break
                except:
                    pass

4.等候购买

def buy(self,times):
        global driver
        print("机器人已经再为您等候时间到来,记得付款嗷!")
        while True:
            now=datetime.datetime.now()
            if now>times:
                while True:
                    try:
                        if driver.find_element(By.ID,'J_Go').get_attribute("class")=="submit-btn":
                            driver.find_element(By.XPATH,'//*[@id="J_Go"]').click()
                            print("结算成功,准备提交订单!")
                            break
                    except:
                        pass
                while True:
                    try:
                        if driver.find_element(By.XPATH,'//*[@id="submitOrderPC_1"]/div/a[2]'):
                            driver.find_element(By.XPATH,'//*[@id="submitOrderPC_1"]/div/a[2]').click()
                            print("提交订单成功,请尽快付款!")
                            break
                    except:
                        pass

上述函数均为类内函数,类的全部代码暂不放出,以防止直接复制粘贴造成技术滥用。

 3.3主程序

option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')
driver = webdriver.Chrome(options=option)
robot = Robot("https://www.taobao.com",int(input("请输入密码:")))
print("请输入年-月-日-小时-分钟的格式设置输入时间!~")
Time=input().split("-")
Time=[int(Time[i]) for i in range(len(Time))]
#print(time)
set_time = datetime.datetime(Time[0],Time[1],Time[2],Time[3],Time[4])
robot.get_url()
robot.login()
# 设置抢购时间
robot.buy(set_time)

4.技术细节

抢单软件的关键部分在于Selenium库的调用,其中Selenium库也只使用到了两类方法:

#1.跳转到指定网址
driver.get("目标网址")

#2.通过不同属性方法获取目标元素
driver.find_element(By.###,"###")

在第二类方法的基础上我们可以对元素执行更多的操作:

例如获取相关状态信息和进行click()操作:

#获取淘宝购物车结算状态,当勾选了商品时,结算按钮的状态会发生变化,
#我们就可以捕获到并作为判断条件。 
if driver.find_element(By.ID,'J_Go').get_attribute("class")=="submit-btn":
    #获得结算按钮元素的两种方式,并进行了属性判断和行为操作
    driver.find_element(By.XPATH,'//*[@id="J_Go"]').click()#结算按钮的点击操作。
    print("结算成功,准备提交订单!")

当然,读者需要一些浏览器调试基础,来获取到相关元素的属性,可自行百度学习,不同购物网站的设计方式均不同,在此不做赘述。

5.写在最后

        知识不是用来盈利的工具,而是用来不交智商税。       

        不想为知识壁垒付费,就要多学习并掌握知识。

        希望大家也多学习一下法律知识,别一不小心进去了。

你可能感兴趣的:(python,开发语言,爬虫)