本项目是利用了selenium+chrome来自动抢狗,类似于爬虫,可以设置抢狗的金额范围。验证码识别是调用百度云端OCR识别,速度不算快,1到2秒左右,准确率50%吧,如果嫌不准也可以自己手敲验证码。
主文件
from splinter.browser import Browser
from time import sleep
import urllib.request
import recognize_img as ocr
#from selenium.webdriver.support.wait import WebDriverWait
#from selenium.webdriver.support import expected_conditions as EC
#from selenium.webdriver.common.by import By
# 初始化驱动
driver = Browser(driver_name="chrome",executable_path=r"./chromedriver.exe")
# 初始化浏览器窗口大小
# driver.driver.set_window_size(1400, 1000)
driver.driver.maximize_window()
driver.visit("https://pet-chain.baidu.com/")
# 这里先自己登陆莱茨狗官网,然后把登陆后的cookies复制到这里,{'name':'key', 'value':'value'}格式添加
driver.driver.add_cookie({'name':'__cfduid', 'value':'xxxxxx'})
driver.driver.add_cookie({'name':'BAIDUID', 'value':'xxxxxx'})
driver.driver.add_cookie({'name':'FG', 'value':'xxxxxx'})
driver.driver.add_cookie({'name':'PSTM', 'value':'xxxxxx'})
driver.driver.add_cookie({'name':'BIDUPSID', 'value':'xxxxxx'})
driver.driver.add_cookie({'name':'MCITY', 'value':'xxxxxx'})
driver.driver.add_cookie({'name':'H_PS_PSSID', 'value':'xxxxxx'})
driver.driver.add_cookie({'name':'BDRCVFR[feWj1Vr5u3D]', 'value':'xxxxxx'})
driver.driver.add_cookie({'name':'PSINO', 'value':'xxxxxx'})
driver.driver.add_cookie({'name':'BDORZ', 'value':'xxxxxx'})
driver.driver.add_cookie({'name':'BDUSS', 'value':'xxxxxx'})
#def wait_display(xpath):
# WebDriverWait(driver.driver, 10, 0.5).until(EC.element_to_be_clickable((By.XPATH, xpath))) # 显性等待
def is_chinese(s):
if s >= u'\u4e00' and s<=u'\u9fa5':
return True
else:
return False
def get_cheap_dog():
sleep(0.5)
driver.find_by_text(u"价格").click()
# driver.driver.find_element_by_xpath("//header/div/div/span[2]").click()
sleep(1) # 强制等待
# driver.driver.implicitly_wait(3) # 隐式等待
# wait_display("//div[@class='dog']") # 显性等待
dog_list = driver.driver.find_elements_by_xpath("//div[@class='dog']")#/dl/dd/h3/span[2]")
return dog_list
def get_verification_code():
sleep(0.5)
image_url = driver.driver.find_element_by_xpath("//div[@class='sms-img']/img").get_attribute("src")
response = urllib.request.urlopen(image_url)
verify_img = response.read()
with open('download.jpg', 'wb') as f:
f.write(verify_img)
v_code = ocr.start_recognize(r"download.jpg")
return v_code
if __name__ == '__main__':
isFirst = True
while True:
try:
if isFirst:
isFirst = False
else:
driver.visit("https://pet-chain.baidu.com/")
dog_list = get_cheap_dog()
for item in dog_list:
price = int(float(item.find_element_by_xpath("dl/dd/div/span/span").text))
# print(price)
if price <= 500: # 设置金额
item.click()
while True:
sleep(0.5)
driver.find_by_text("确认购买").click()
# v_code = "EFR9"
# sleep(1)
# 百度OCR识别
# v_code = get_verification_code()
# while len(v_code) != 4 or not v_code.isalnum() or is_chinese(v_code): # 长度不等于4,不是字母和数字,包含中文
# driver.driver.find_element_by_xpath("//i[@class='icon-font icon-shuaxin']").click()
# v_code = get_verification_code()
# driver.driver.find_element_by_xpath("//input").send_keys(v_code)
# 人工输入
sleep(0.5)
v_code = ""
driver.driver.find_element_by_xpath("//input").send_keys("")
while True:
v_code = driver.driver.find_element_by_xpath("//input").get_attribute("value")
# print("v_code:",v_code)
if len(v_code) == 4:
break
else:
sleep(0.5)
sleep(0.5)
driver.find_by_text("立即购买").click()
sleep(1)
msg = driver.driver.find_element_by_xpath("//span[@class='mint-toast-text']").text
if msg != "验证码错误":
print("="*10,msg,"="*10)
break
break
except Exception as error:
print(error)
OCR验证码识别文件代码
import time
from PIL import Image
from PIL import ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
from aip import AipOcr
""" (百度ocr)你的 APPID AK SK """
APP_ID = 'xxxxxx'
API_KEY = 'xxxxxx'
SECRET_KEY = 'xxxxxx'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
def start_recognize(file):
start = time.time()
im = Image.open(file)
w, h = im.size
region = im.resize((int(w * 1.5), int(h * 1.5)))
region.save(r"./tmp.png")
image = get_file_content(r"tmp.png")
respon = client.basicGeneral(image) # 用完500次后可改respon = client.basicAccurate(image)
titles = respon['words_result'] # 获取问题
print("respon:", respon)
print("验证码:", titles[0]['words'])
end = time.time()
print('程序用时:' + str(end - start) + '秒')
return titles[0]['words']
if __name__ == '__main__':
start = time.time()
im = Image.open(r"D:\python_work\other\OpenCV\Chapter 7_Code\images\number.PNG")
w, h = im.size
print("xx:{}".format(im.size))
# region = im.crop((70,200, w-70,700)) #裁剪的区域
region = im.resize((int(w * 1.5), int(h * 1.5)))
region.save(r"./crop_test1.png")
image = get_file_content(r"crop_test1.png")
respon = client.basicGeneral(image) # 用完500次后可改respon = client.basicAccurate(image)
titles = respon['words_result'] # 获取问题
print("respon:", respon, "\ntitles:", titles[0]['words'])
end = time.time()
print('程序用时:' + str(end - start) + '秒')