最近双十一已经到了,笔者为了拓展技术水平研究了一下网络爬虫技术,其中双十一给人印象最深刻地就是抢单了,“爬虫学的好,监狱进得早”。本着学术和技术研究的态度,笔者仅使用了普通商品进行测试操作,不进行盈利活动。
抢单操作其含义在于到达预定时间,使得我们电脑控制浏览器自动完成相关过程。
因此可以调用python 的selenium包可以实现与浏览器交互,但目前浏览器厂商未直接支持webdriver,因此我们还需要下载诸如 chromedriver.exe(chrome)等浏览器驱动供python调用。
小编以淘宝网为例,脚本最终可直接进入付款界面,证明了这条技术路线是可行高效的,但最终触发了淘宝的支付异常,不得不说支付宝在这方面做的还是很牛的,所以写下这篇博客权当技术研究记录。
设备:一台可以上网的计算机
软件:操作系统、浏览器
编程语言:Python
使用pip命令即可简单高效地下载并安装selenium包,我们可从官网下载各个浏览器的驱动程序(.exe),为了方便起见,直接将驱动exe文件放入代码目录下即可。
小编也是借鉴网络上大佬们发布的相关代码,但随着selenium的最近一次更新,很多网络上的代码已经不能用了,并且这些代码比较基础简单,交互性不够好,因此本人也做了一些改进。
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import datetime
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
上述函数均为类内函数,类的全部代码暂不放出,以防止直接复制粘贴造成技术滥用。
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)
抢单软件的关键部分在于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("结算成功,准备提交订单!")
当然,读者需要一些浏览器调试基础,来获取到相关元素的属性,可自行百度学习,不同购物网站的设计方式均不同,在此不做赘述。
知识不是用来盈利的工具,而是用来不交智商税。
不想为知识壁垒付费,就要多学习并掌握知识。
希望大家也多学习一下法律知识,别一不小心进去了。