通过传统的识别手段点选验证码会比较麻烦,好在超级鹰也提供了相应的接口,如下图所示(详见https://www.chaojiying.com/price.html)。
我们只需修改2.1节中定义的cjy()函数的代码,将其中的PosPic()函数的第2个参数改成与点选验证码的类型对应的接口,如9004,修改后的代码如下:
def cjy(): #使用超级鹰识别图像验证码的自定义函数
chaojiying = Chaojiying_Client('账号', '密码', '软件id') # 用户中心>>软件ID
im = open('a.png', 'rb').read() # 打开本地图片文件,有时WIN系统须要//
code = chaojiying.PostPic(im,9004)['pic_str']
from selenium import webdriver
import time
browser = webdriver.Chrome()
url = r'D:\works\python_crawl1\《Python爬虫(进阶与进通)》代码汇总\2.验证码反爬\5.点选验证码\点选验证码本地版\index.html'
browser.get(url) #用模拟浏览器打开网页
time.sleep(5) #等待一段时间,让验证码加载完毕
canvas = browser.find_element_by_xpath('//*[@id="verify"]') #定位点选验证码
canvas.screenshot('a.png') #截取图片
from chaojiying import Chaojiying_Client
def cjy(): #使用超级鹰识别图像验证码的自定义函数
chaojiying = Chaojiying_Client('账号', '密码', 'ID') # 用户中心>>软件ID
im = open('a.png', 'rb').read() # 打开本地图片文件,有时WIN系统须要//
code = chaojiying.PostPic(im,9004)['pic_str']
return code
result = cjy()
result
'393,55|405,118|552,43|553,165'
all_location = [] # 创建一个空列表,用于汇总处理后的各个文字的坐标
list_temp = result.split('|') #根据“|”拆分字符串,存储为临时列表
print(list_temp)
['393,55', '405,118', '552,43', '553,165']
for i in list_temp:
list_i = [] # 创建一个空列表,用于存储每个文字的坐标
x = int(i.split(',')[0]) #根据","拆分字符串,提取第1个元素(x坐标)并转换为整数
y = int(i.split(",")[1])
list_i.append(x) #添加x坐标
list_i.append(y) #添加y坐标
all_location.append(list_i)
all_location
[[393, 55], [405, 118], [552, 43], [553, 165]]
for i in all_location:
x = i[0] # 提取x坐标
y = i[1] # 提取y坐标
action = webdriver.ActionChains(browser) # 启动动作链
action.move_to_element_with_offset(canvas,x,y).click().perform() #根据坐标模拟单击文字
time.sleep(1)
from chaojiying import Chaojiying_Client
from selenium import webdriver
import time
# 1.访问网址
browser = webdriver.Chrome()
url = r'D:\works\python_crawl1\《Python爬虫(进阶与进通)》代码汇总\2.验证码反爬\5.点选验证码\点选验证码本地版\index.html'
browser.get(url) #用模拟浏览器打开网页
time.sleep(5) #等待一段时间,让验证码加载完毕
# 2.截取点选验证码图片
canvas = browser.find_element_by_xpath('//*[@id="verify"]') #定位点选验证码
canvas.screenshot('a.png') #截取图片
# 3.使用超级鹰识别,获得各个文字的坐标
def cjy(): #使用超级鹰识别图像验证码的自定义函数
chaojiying = Chaojiying_Client('账号', '密码', ' 932868') # 用户中心>>软件ID
im = open('a.png', 'rb').read() # 打开本地图片文件,有时WIN系统须要//
code = chaojiying.PostPic(im,9004)['pic_str']
return code
result = cjy()
print(result)
# 4.对获得的坐标进行数据处理
all_location = [] # 创建一个空列表,用于汇总处理后的各个文字的坐标
list_temp = result.split('|') #根据“|”拆分字符串,存储为临时列表
print(list_temp)
for i in list_temp:
list_i = [] # 创建一个空列表,用于存储每个文字的坐标
x = int(i.split(',')[0]) #根据","拆分字符串,提取第1个元素(x坐标)并转换为整数
y = int(i.split(",")[1])
list_i.append(x)
list_i.append(y)
all_location.append(list_i)
print(all_location)
# 5.依次模拟单击文字
for i in all_location:
x = i[0] # 提取x坐标
y = i[1] # 提取y坐标
action = webdriver.ActionChains(browser) # 启动动作链
action.move_to_element_with_offset(canvas,x,y).click().perform() #根据坐标模拟单击文字
time.sleep(1)
user = '账号' #需要改为实际登录的账号
password = '密码' #需改为实际登录的密码
browser.find_element_by_xpath('//*[@id="login-username"]').send_keys(user) #模拟输入账号
browser.find_element_by_xpath('//*[@id="login-passwd"]').send_keys(password) #模拟输入密码
browser.find_element_by_xpath('//*[@id="geetest-wrap"]/div/div[5]/a[1]').click() #模拟单击“登录"按钮
time.sleep(2)
canvas = browser.find_element_by_xpath('//*[@id="login-app"]/div/div[2]/div[3]/div[3]')
canvas.screenshot('bilibili.png')
from chaojiying import Chaojiying_Client
chaojiying = Chaojiying_Client('超级鹰账号', '密码', 'ID')
im = open('bilibili.png','rb').read() #打开本地图片文件
str = chaojiying.PostPic(im,9004)['pic_str'] #使用9004接口
all_location = [] # 创建一个空列表,用于汇总处理后的各个文字的坐标
list_temp = str.split('|') #根据“|”拆分字符串,存储为临时列表
print(list_temp)
for i in list_temp:
list_i = [] # 创建一个空列表,用于存储每个文字的坐标
x = int(i.split(',')[0]) #根据","拆分字符串,提取第1个元素(x坐标)并转换为整数
y = int(i.split(",")[1])
list_i.append(x)
list_i.append(y)
all_location.append(list_i)
print(all_location)
for i in all_location:
x = i[0] # 提取x坐标
y = i[1] # 提取y坐标
action = webdriver.ActionChains(browser) # 启动动作链
action.move_to_element_with_offset(canvas,x,y).click().perform() #根据坐标模拟单击文字
time.sleep(1)
browser.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[3]/a/div').click() #模拟单击验证码“确认"按钮
from chaojiying import Chaojiying_Client
from selenium import webdriver
import time
# 1.访问网址
browser = webdriver.Chrome()
url = 'https://passport.bilibili.com/login'
browser.get(url) #用模拟浏览器打开网页
# 2.模拟登录账号和密码,并模拟单击“登录”按钮
user = '账号' #需要改为实际登录的账号
password = '密码' #需改为实际登录的密码
browser.find_element_by_xpath('//*[@id="login-username"]').send_keys(user) #模拟输入账号
browser.find_element_by_xpath('//*[@id="login-passwd"]').send_keys(password) #模拟输入密码
browser.find_element_by_xpath('//*[@id="geetest-wrap"]/div/div[5]/a[1]').click() #模拟单击“登录"按钮
time.sleep(2)
# 3.截取点选验证码图片
canvas = browser.find_element_by_xpath('//*[@id="login-app"]/div/div[2]/div[3]/div[3]')
canvas.screenshot('bilibili.png')
# 4.使用超级鹰识别点选验证码
chaojiying = Chaojiying_Client('账号', '密码', ' 932868')
im = open('bilibili.png','rb').read() #打开本地图片文件
str = chaojiying.PostPic(im,9004)['pic_str'] #使用9004接口
print(str)
# 4.对获得的坐标进行数据处理
all_location = [] # 创建一个空列表,用于汇总处理后的各个文字的坐标
list_temp = str.split('|') #根据“|”拆分字符串,存储为临时列表
print(list_temp)
for i in list_temp:
list_i = [] # 创建一个空列表,用于存储每个文字的坐标
x = int(i.split(',')[0]) #根据","拆分字符串,提取第1个元素(x坐标)并转换为整数
y = int(i.split(",")[1])
list_i.append(x)
list_i.append(y)
all_location.append(list_i) # 汇总各个文字的坐标
print(all_location)
# 6.依次模拟单击文字
for i in all_location:
x = i[0] # 提取x坐标
y = i[1] # 提取y坐标
action = webdriver.ActionChains(browser) # 启动动作链
action.move_to_element_with_offset(canvas,x,y).click().perform() #根据坐标模拟单击文字
time.sleep(1)
# 7.模拟单击“确认”按钮,完成按钮
time.sleep(3)
browser.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[3]/a/div').click() #模拟单击验证码“确认"按钮
while True:
result = yzm()
if '密码登录' in result and '短信登录' in result:
time.sleep(3)
else:
break
def yzm(): #定义验证码识别函数
# 3.截取点选验证码的图片
# 4.使用超级鹰识别点选验证码
# 5.对获取的坐标进行数据处理
# 6.依次模拟单击文字
# 7.模拟单击“确认”按钮,完成登录
# 8.等待2秒后,获取此时的网页源代码
time.sleep(2)
data = browser.page_source
return data
while True:
result = yzm() #调用定义的yzm()函数,函数的返回值为网页源代码
if '密码登录' in result and '短信登录' in result: #判断是否为登录页面,如果是登录页面,说明登录失败
time.sleep(3) #等待3秒后继续循环
else: # 如果不是登录页面,说明进入首页,登录成功
break # 跳出循环
from chaojiying import Chaojiying_Client
from selenium import webdriver
import time
# 1.访问网址
browser = webdriver.Chrome()
url = 'https://passport.bilibili.com/login'
browser.get(url) #用模拟浏览器打开网页
# 2.模拟登录账号和密码,并模拟单击“登录”按钮
user = '账号' #需要改为实际登录的账号
password = '密码' #需改为实际登录的密码
browser.find_element_by_xpath('//*[@id="login-username"]').send_keys(user) #模拟输入账号
browser.find_element_by_xpath('//*[@id="login-passwd"]').send_keys(password) #模拟输入密码
browser.find_element_by_xpath('//*[@id="geetest-wrap"]/div/div[5]/a[1]').click() #模拟单击“登录"按钮
time.sleep(2)
def yzm(): #定义验证码识别函数
# 3.截取点选验证码图片
canvas = browser.find_element_by_xpath('//*[@id="login-app"]/div/div[2]/div[3]/div[3]')
canvas.screenshot('bilibili.png')
# 4.使用超级鹰识别点选验证码
chaojiying = Chaojiying_Client('账号', '密码', ' 932868')
im = open('bilibili.png','rb').read() #打开本地图片文件
str = chaojiying.PostPic(im,9004)['pic_str'] #使用9004接口
print(str)
# 4.对获得的坐标进行数据处理
all_location = [] # 创建一个空列表,用于汇总处理后的各个文字的坐标
list_temp = str.split('|') #根据“|”拆分字符串,存储为临时列表
print(list_temp)
for i in list_temp:
list_i = [] # 创建一个空列表,用于存储每个文字的坐标
x = int(i.split(',')[0]) #根据","拆分字符串,提取第1个元素(x坐标)并转换为整数
y = int(i.split(",")[1])
list_i.append(x)
list_i.append(y)
all_location.append(list_i) # 汇总各个文字的坐标
print(all_location)
# 6.依次模拟单击文字
for i in all_location:
x = i[0] # 提取x坐标
y = i[1] # 提取y坐标
action = webdriver.ActionChains(browser) # 启动动作链
action.move_to_element_with_offset(canvas,x,y).click().perform() #根据坐标模拟单击文字
time.sleep(1)
# 7.模拟单击“确认”按钮,完成按钮
time.sleep(3)
browser.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[3]/a/div').click() #模拟单击验证码“确认"按钮
# 8.等待2秒后,获取此时的网页源代码
time.sleep(2)
data = browser.page_source
return data
# 9.无限尝试识别验证码并登录,直到登录成功为止
while True:
result = yzm() #调用定义的yzm()函数,函数的返回值为网页源代码
if '密码登录' in result and '短信登录' in result: #判断是否为登录页面,如果是登录页面,说明登录失败
time.sleep(3) #等待3秒后继续循环
else: # 如果不是登录页面,说明进入首页,登录成功
break # 跳出循环