您的位置:首页 > 编程语言 > Python开发

百度莱茨狗python自动抢狗,调用百度OCR或者人工识别验证码

2018-02-09 09:44 316 查看
本项目是利用了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) + '秒')

代码地址

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息