首页 文章详情

Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能

python教程 | 657 2020-12-25 04:19 0 0 0
UniSMS (合一短信)

推荐阅读  点击标题可跳转

零基础将Python分成7个阶段学习,你会发现学习Python真的很简单

写在前面

  今天带给大家一个突破点选验证码的案例,利用爬虫模拟登陆哔哩哔哩,并且把一些采坑的地方给大家强调一下!

一、需求分析

  模拟登陆哔哩哔哩

  网站链接: https://passport.bilibili.com/login

效果图如下:

验证成功后会自动跳转B站的登录界面,为了保护我的信息安全,我用了假用户名

二、编程思路

  首先利用xpath或者css选择器等方法找到要输入内容的元素位置,然后用自动化爬虫工具Selenium模拟点击输入等操作来进行登录并分析页面,获取点选验证码的点选图片,通过将图片发送给快识别打码平台识别后获取坐标信息,根据快识别返回的数据,模拟坐标的点选,即可实现登录。

三、前期准备

1.下载chrome driver

  就是下载谷歌浏览器的驱动器,当然如果你用其他浏览器那么就要下载其他浏览器的相应驱动,这里我以chrome浏览器为例,为什么要用英文呢?啊,这还用问当然是为了洋气啦!(手动狗头)
  下载驱动的时候必须要下载相应的版本,可以在浏览器上方输入chrome://version,即可查看自己的chrome版本。

然后进入 https://npm.taobao.org/mirrors/chromedriver/网站下载相应版本的驱动。

2.安装selenium库

  由于是第三方库,所以在使用selenium之前需要先安装:

pip install selenium

安装的时候建议大家换镜像源,具体方法可以参考这篇文章
链接: https://www.jb51.net/article/202564.htm

3.对接打码平台

  根据我们前面的编程思路我们需要到快识别网站http://www.kuaishibie.cn/根据给出的开发文档和我们所需要的打码功能构建一个自己的api。

代码如下:

  1. #快识别网址 http://www.kuaishibie.cn/

  2. #interface

  3. import base64

  4. import json

  5. import requests

  6.  

  7. def base64_api(uname,pwd,img):

  8. '''

  9. 验证码识别接口

  10. :param uname: 快识别用户名

  11. :param pwd: 快识别密码

  12. :param img: 图片路径

  13. :return: 返回识别结果

  14. '''

  15. with open(img, 'rb') as f:

  16. base64_data = base64.b64encode(f.read())

  17. b64 = base64_data.decode()

  18. data = {"username": uname, "password": pwd, "image": b64,"typeid":21}

  19. #result = json.loads(requests.post("http://api.ttshitu.com/base64", json=data).text)

  20. result = json.loads(requests.post("http://api.ttshitu.com/imageXYPlus", json=data).text)

  21. if result['success']:

  22. return result["data"]["result"]

  23. else:

  24. return result["message"]

三、完整代码

  代码中的一些难点和相关步骤我都做了注释,根据上面给出的编程思路大家一步一步做就好了,我就不再详细解释了,如果任何问题欢迎评论区提问或者私信我都可以喔~

  1. #login_bilibili

  2. from selenium import webdriver

  3. import time

  4. from PIL import Image

  5. from selenium.webdriver import ActionChains #导入动作链模块

  6.  

  7.  

  8. KUAI_USERNAME = '快识别账号'

  9. KUAI_PASSWORD = '快识别密码'

  10.  

  11. USERNAME = 'B站账号'

  12. PASSWORD = 'B站密码'

  13.  

  14. #创建浏览器对象

  15. driver = webdriver.Chrome(executable_path='chromedriver.exe')

  16. #打开请求网页页面

  17. driver.get('https://passport.bilibili.com/login')

  18. driver.implicitly_wait(10) #隐式等待浏览器渲染完成,sleep是强制等待

  19. #driver.execute_script("document.body.style.zoom='0.67'") #浏览器内容缩放67%

  20. driver.maximize_window()#最大化浏览器

  21.  

  22. '''

  23. 用selenium自动化工具操作浏览器,操作的顺序和平常用浏览器操作的顺序是一样的

  24. '''

  25.  

  26. '''

  27. 找到用户名和密码框输入密码

  28. '''

  29. user_input = driver.find_element_by_xpath('//*[@id="login-username"]') #使用xpath定位用户名标签元素

  30. user_input.send_keys(USERNAME)

  31. time.sleep(1)

  32.  

  33. user_input = driver.find_element_by_xpath('//*[@id="login-passwd"]') #用户密码标签

  34. user_input.send_keys(PASSWORD)

  35. time.sleep(1)

  36.  

  37. #点击登录

  38. Login_input = driver.find_element_by_css_selector('#geetest-wrap > div > div.btn-box > a.btn.btn-login')

  39. Login_input.click()

  40. time.sleep(5)

  41.  

  42. #对图片验证码进行提取

  43. img_label = driver.find_element_by_css_selector('body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_no_logo.geetest_panelshowclick > div.geetest_panel_next > div > div') #提取图片标签

  44.  

  45. #保存图片

  46. driver.save_screenshot('big.png') #截取当前整个页面

  47. time.sleep(5)

  48. #location可以获取这个元素左上角坐标

  49. print(img_label.location)

  50. #size可以获取这个元素的宽(width)和高(height)

  51. print(img_label.size)

  52.  

  53. #计算验证码的左右上下横切面

  54. left = img_label.location['x']

  55. top = img_label.location['y']

  56. right = img_label.location['x'] + img_label.size['width']

  57. down = img_label.location['y'] + img_label.size['height']

  58.  

  59. im = Image.open('big.png')

  60. im = im.crop((left,top,right,down))

  61. im.save('yzm.png')

  62.  

  63. #对接打码平台

  64. from interface import base64_api #显示报错也无妨,可以运行的不要被唬住

  65.  

  66. img_path = 'yzm.png'

  67. result = base64_api(uname=KUAI_USERNAME, pwd=KUAI_PASSWORD, img=img_path)

  68. print(result)

  69. print('验证码识别结果:', result)

  70. result_list = result.split('|')

  71. for result in result_list:

  72. = result.split(',')[0]

  73. = result.split(',')[1]

  74. ActionChains(driver).move_to_element_with_offset(img_label, int(x), int(y)).click().perform() # perform()执行整个动作链

  75.  

  76. #点击确认按钮

  77. driver.find_element_by_css_selector('body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_no_logo.geetest_panelshowclick > div.geetest_panel_next > div > div > div.geetest_panel > a > div').click()

  78. input() # 用户输入 阻塞浏览器关闭

  79. # 关闭浏览器

  80. driver.quit()

注:chrome driver一定要和项目文件放在一起,这样更加方便也更稳定。interface接口文件最好也喝项目文件在一起,方便import导入

  然后就可以自动登录到B站啦,还在等什么,赶紧试试吧~

扫下方二维码加老师微信

或是搜索老师微信号:XTUOL1988【切记备注学习Python】

领取Python web开发,Python爬虫,Python数据分析,人工智能等学习教程。带你从零基础系统性的学好Python!

也可以加老师建的Python技术学习教程qq裙:245345507二者加一个就可以!

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

万水千山总是情,点个【在看】行不行

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜

good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter