越过验证码 selenium模拟登录B站项目实战(附源码)

实战:selenium模拟登录B站

登录验证码处理

selenium 中的难点验证码破解因为确实没有很好的方式,一般都需要通过第三方平台实现破解,本案例中使用的是超级鹰平台(收费,大概1元30次,测试用冲个1元就足够)。下面实战开始!

分析登录界面结构

B站登录界面如下。

首先明确我们的目标,打开登陆界面,定位用户名和密码对应的标签,输入相关数据后,点击登录,此时页面会弹出文字验证码。

下文会用两种方法进行验证码图片的获取,并提交给超级鹰进行识别,接收到汉字的坐标后,处理坐标数据,然后用动作链点击对应坐标操作,完成登录。

下面使用 selenium 打开登录页面。

driver.get('https://passport.bilibili.com/login')
# 定位用户名,密码输入框
username = driver.find_element_by_id('login-username')
password = driver.find_element_by_id('login-passwd')
# 将自己的用户名密码替换xxxxxx
username.send_keys('xxxxxx')
password.send_keys('xxxxxx')

# 定位登录按钮并点击
driver.find_element_by_xpath('//*[@id="geetest-wrap"]/div/div[5]/a[1]').click()

获取页面当前验证码图片

方法一、页面截图,将验证码区域进行裁剪保存

使用此方法时,注意我们截取验证码图片时需要截取完整,不要只截图片部分,上面文字也需要。完整验证码截图如下:

首先将点击登录后的页面进行截图,然后定位到验证码的位置,通过location()方法获取验证码左上角的坐标, size() 获取验证码的宽和高,左上角坐标加上宽和高就是验证码右下角的坐标。获取坐标后就可以用**crop()**方法来进行裁剪,然后将裁剪到的验证码图片保存。

此时虽然获取了验证码图片,但是还不能直接提交给超级鹰。

因为超级鹰识别的验证码图片的宽和高有限制,最好不超过 460px,310px。

但是截取到的验证码图片宽高为 338px,432px,这时就要先将图片缩小一倍再提交即可,等到收到坐标数据再将坐标乘2。

def save_img():
# 对当前页面进行截图保存
driver.save_screenshot('page.png')
# 定位验证码图片的位置
code_img_ele = driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div')
# 获取验证码左上角的坐标x,y
location = code_img_ele.location
# 获取验证码图片对应的长和宽
size = code_img_ele.size

# 左上角和右下角的坐标
rangle = (
int(location['x'] * 1.25), int(location['y'] * 1.25), int((location['x'] + size['width']) * 1.25),
int((location['y'] + size['height']) * 1.25)
)

i = Image.open('./page.png')
code_img_name = './code.png'
# crop根据rangle元组内的坐标进行裁剪
frame = i.crop(rangle)
frame.save(code_img_name)
return code_img_ele

def narrow_img():
# 缩小图片
code = Image.open('./code.png')
small_img = code.resize((169, 216))
small_img.save('./small_img.png')
print(code.size, small_img.size)

方法二、通过网页获取图片地址,并保存

这种方法比上一种更加方便,分析网页源码获取图片地址,对该地址发送请求,接收返回的二进制文件,进行保存。首先打开网页源码找到图片地址。

图片地址是 img 标签的 src 属性值,通过 xpath 得到地址,直接对此 url 发送请求,接收数据并保存即可。

注意:由于获取的图片的高度仍然大于超级鹰标准格式,所以也需要将图片缩小。

# 获取img标签的src属性值
img_url = driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[2]/div[1]/div/div[2]/img').get_attribute('src')
headers = {
'Users-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36'
}
# 获取图片二进制数据
img_data = requests.get(url=img_url, headers=headers).content
with open('./node1.png', 'wb')as fp:
fp.write(img_data)
i = Image.open('./node1.png')
# 将图片缩小并保存,设置宽为172,高为192
small_img = i.resize((172, 192))
small_img.save('./small_img1.png')

使用超级鹰识别验证码

这部分没什么说的,直接调用就行。

# 将验证码提交给超级鹰进行识别
chaojiying = Chaojiying_Client('用户名', '密码', '96001') # 用户中心>>软件ID 生成一个替换 96001
im = open('small_img.png', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
# 9004是验证码类型
print(chaojiying.PostPic(im, 9004)['pic_str'])
result = chaojiying.PostPic(im, 9004)['pic_str']

提取坐标数据,动作链点击

超级鹰识别返回的数据格式是:123,12 | 234,21 。我们可以将数据以 ' | ' 进行分割,保存到列表中,再以逗号分割将 x,y 的坐标保存,得到 [ [123,12],[234,21] ] 这一格式,然后遍历这一列表,使用动作链对每一个列表元素对应的 x,y 指定的位置进行点击操作,最后定位并点击确认,登录成功。

all_list = [] # 要存储即将被点击的点的坐标 [[x1,y1],[x2,y2]]
if '|' in result:
list_1 = result.split('|')
count_1 = len(list_1)
for i in range(count_1):
xy_list = []
x = int(list_1[i].split(',')[0])
y = int(list_1[i].split(',')[1])
xy_list.append(x)
xy_list.append(y)
all_list.append(xy_list)
else:
x = int(result.split(',')[0])
y = int(result.split(',')[1])
xy_list = []
xy_list.append(x)
xy_list.append(y)
all_list.append(xy_list)
# 遍历列表,使用动作链对每一个列表元素对应的x,y指定的位置进行点击操作
# x,y坐标乘2和0.8,是由于之前图片缩放过,所以*2,0.8是因为本人电脑桌面缩放比例为125%,需要还原成1
for l in all_list:
x = l[0] * 2 * 0.8
y = l[1] * 2 * 0.8
# 将点击操作的参照物移动到指定的模块,
# 若用方法二获取的验证码图片,要添加下面代码对code_img_ele赋值
# code_img_ele = bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[2]/div[1]/div/div[2]/img')
ActionChains(driver).move_to_element_with_offset(code_img_ele, x, y).click().perform()
print('点击已完成')
# 完成动作链点击操作后,定位确认按钮并点击
driver.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[3]/a').click()

运行效果

由于验证码处理需要用到第三方平台,外加设置了强制等待,整体运行速度较慢。

这是个动图,稍等一下

❤️源码获取❤️

鉴于篇幅限制,这里无法放入全部项目源码,需要源码的朋友可以私信我关键词“源码”免费获取

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Selenium是一个流行的自动化测试工具,它支持模拟浏览器操作,包括登录网站。要在Selenium登录B站(哔哩哔哩),你需要遵循以下步骤: 1. 安装必要的库:首先确保你已经安装了Selenium和WebDriver(对应你使用的浏览器的Driver,如ChromeDriver、FirefoxDriver等)。你可以使用pip来安装它们: ``` pip install selenium webdriver_manager ``` 2. 引入所需的库和模块: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys from webdriver_manager.chrome import ChromeDriverManager ``` 3. 初始化浏览器并打开B站登录页面: ```python driver = webdriver.Chrome(ChromeDriverManager().install()) driver.get("https://passport.bilibili.com/login") ``` 4. 找到登录表单元素: 需要定位到输入用户名和密码的输入框以及登录按钮。这通常可以通过`find_element_by_*`方法找到,例如`driver.find_element_by_name('username')`或`driver.find_element_by_id('login_form')`。 5. 输入用户名和密码: ```python username_input = driver.find_element_by_name('username') password_input = driver.find_element_by_name('password') username_input.send_keys('your_username') password_input.send_keys('your_password') # 如果有验证码,你可能需要处理它,或者等待验证码加载完成 ``` 6. 提交表单: ```python login_button = driver.find_element_by_id('login-form-action') login_button.click() ``` 7. 等待登录完成或检查登录状态: 登录后,你可以查看是否成功跳转到了B站首页或者检查登录后的cookies信息。 8. 关闭浏览器: ```python driver.quit() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢软测的小北葵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值