目录
一 、Chrome(谷歌)驱动器的下载
(一)驱动器版本选择
1.查看自己电脑Chrome浏览器版本
点击谷歌浏览器主页右上角三个点——>点击帮助——>关于Google Chrome(如下图:)
查看结果如下:
(二)下载Chrome驱动器
1.下载谷歌浏览器驱动器Chromedriver地址:
2.驱动器下载版本需大于等于浏览器版本。
本机浏览器版本:107.0.5304.107
所以选择如下图版本下载:
3.点击下载
4.解压并放到Python项目下:
二、需要安装的库
如下图:
(一)安装命令
先点击terminal进入终端,输入pip install xxx(库的名称)
注:selenium需要指定版本3.141.0
命令:pip install selenium==3.141.0
(二)指定selenium版本原因
后面在获取登录验证码元素时需使用find_element_by_css_selector的方法获取验证码元素。
若使用find_element方法项目最后一步会报错:如图
三、实现步骤
(一)导入相关库
# 时间模块
import time
# selenium的动作链模块
from selenium.webdriver import ActionChains
# 导入超级鹰打码平台模块(choajiying.py文件的Chaojiying_Client类)
from chaojiying import Chaojiying_Client
# 驱动器模块
from selenium import webdriver
from selenium.webdriver.common.by import By
注:chaojiying是打码平台提供的一个python文件后面会讲到。
(二)创建驱动器对象
# B站的网页地址
url = 'https://www.bilibili.com/'
# 创建驱动器对象
driver = webdriver.Chrome
# driver = webdriver.Chrome(executable_path='驱动器路径')
# 传入URL地址
driver.get(url)
注:若驱动器没在项目路径下,需手动指定驱动器路径。
(三)点击登录,并输入账号密码
1.打开网页版b站:哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
2.按F12(或右键点击检查)打开 开发者工具
3.定位元素
有爬虫基础的可以 自己写xpath、css等元素定位方法。
(1)点击登录按钮弹出登录框
点击开发者工具右上角的箭头(标签选择器)——>再点击登录按钮——>右键copy被选中元素的selector路径——直接粘贴到代码里——>调用click()方法——延迟3秒等待加载(如下图、代码)
# 点击登录按钮,获取登录页面
driver.find_element(By.CSS_SELECTOR,'#i_cecream > div.bili-feed4 > div.bili-header.large-header > div.bili-header__bar > ul.right-entry > li:nth-child(1) > li > div.right-entry__outside.go-login-btn > div').click()
time.sleep(3)
注:#i_cecream > div.bili-feed4 > div.bili-header.large-header > div.bili-header__bar > ul.right-entry > li:nth-child(1) > li > div.right-entry__outside.go-login-btn > div 即为selector路径
(2)输入账号和密码
点击开发者工具右上角的箭头(标签选择器)——>再点击账号、密码输入框——>分别右键copy被选中元素的selector路径——直接粘贴到代码里——>调用send_keys()方法——延迟1到2秒等待加载(如下图、代码)
# 输入账号,密码
driver.find_element(By.CSS_SELECTOR,'body > div.bili-mini-mask > div > div.bili-mini-content > div.bili-mini-login-wrapper > div.bili-mini-password-wrapper > div.bili-mini-account > input[type=text]').send_keys('账号')
time.sleep(1)
driver.find_element(By.CSS_SELECTOR,'body > div.bili-mini-mask > div > div.bili-mini-content > div.bili-mini-login-wrapper > div.bili-mini-password-wrapper > div.bili-mini-password > div.left > input[type=password]').send_keys('密码')
time.sleep(2)
(3)点击确定登录按钮
点击开发者工具右上角的箭头(标签选择器)——>再点击登录按钮——>右键copy被选中元素的selector路径——直接粘贴到代码里——>调用click()方法——延迟2秒等待加载(如下图、代码)
# 点击确定登录按钮
driver.find_element(By.CSS_SELECTOR,'body > div.bili-mini-mask > div > div.bili-mini-content > div.bili-mini-login-wrapper > div.bili-mini-login-register-wrapper > div.universal-btn.login-btn').click()
time.sleep(2)
(四)获取验证码框元素,并截图
点击开发者工具右上角的箭头(标签选择器)——>再点击验证码框——>右键copy被选中元素的selector路径——直接粘贴到代码里——>调用screenshot()方法进行截图并命名为yzm.png保存到该项目目录下(如下图、代码)
# 获取验证码的元素,并进行截图。
image = 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')
image.screenshot('yzm.png'))
打码平台的作用:获取验证码截图需要点击的汉字的坐标位置。
1.注册超级鹰账号
地址:超级鹰验证码识别-专业的验证码云端识别服务,让验证码识别更快速、更准确、更强大
2.获取题分(1元=1000题分)
3.下载python开发文档
点击开发文档——>选择python语言——>点击这里下载——>解压并将chaojiying.py文件放到python项目下
4.创建软件ID
进入用户中心——>点击软件ID——>再点击生成一个软件ID——>输入任意的软件名称——>点击提交会生成一个如下图的软件ID
5.将chaojiying.py文件导入到项目文件中(如下代码)
# 导入超级鹰打码平台模块(choajiying.py文件的Chaojiying_Client类)
from chaojiying import Chaojiying_Client
6.导入超级鹰类
并输入账号,密码,软件ID,以二进制的方式读取验证码图片,获取验证码的坐标字典,并取出坐标值。
# 导入超级鹰,并输入账号,密码,软件ID
chaojiying = Chaojiying_Client('账号', '密码', '软件ID') # 用户中心>>软件ID 生成一个替换 96001
im = open('yzm.png', 'rb').read() # 以二进制的方式读取验证码
result = chaojiying.PostPic(im, 9004)['pic_str'] #获取验证码的坐标字典,并取出坐标值
pic_str为返回的坐标值并通过键取出值。
7.点击验证码
对返回的验证码坐标值进行处理,得到每个验证码的x轴和y轴。
创建动作链对象通过move_to_element_with_offset方法依次点击验证码。
for index in result.split('|'): #以"|"进行分割,得到一个列表,并循环出每一个字的坐标
x = index.split(',')[0] # 得到x轴的坐标
y = index.split(',')[1] # 得到y轴的坐标
action = ActionChains(driver) #创建动作链对象
action.move_to_element_with_offset(image,int(x),int(y)).click().perform()
# image:验证码的元素框;x:验证码的横轴;y:验证码的纵轴
time.sleep(1)
8.点击确认完成登录
time.sleep(1) # 加载一秒后在进行点击
driver.find_element(By.CSS_SELECTOR,'body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_panelshowclick > div.geetest_panel_next > div > div > div.geetest_panel > a > div').click()
四、完整代码
# _*_ coding : utf-8 _*_
# 时间模块
import time
# selenium的动作链模块
from selenium.webdriver import ActionChains
# 导入超级鹰打码平台模块(choajiying.py文件的Chaojiying_Client类)
from chaojiying import Chaojiying_Client
# 驱动器模块
from selenium import webdriver
from selenium.webdriver.common.by import By
# B站的网页地址
url = 'https://www.bilibili.com/'
driver = webdriver.Chrome() # 若驱动器没在
driver.get(url)
# 点击登录按钮,获取登录页面
driver.find_element(By.CSS_SELECTOR,'#i_cecream > div.bili-feed4 > div.bili-header.large-header > div.bili-header__bar > ul.right-entry > li:nth-child(1) > li > div.right-entry__outside.go-login-btn > div').click()
time.sleep(3)
# 输入账号,密码
driver.find_element(By.CSS_SELECTOR,'body > div.bili-mini-mask > div > div.bili-mini-content > div.bili-mini-login-wrapper > div.bili-mini-password-wrapper > div.bili-mini-account > input[type=text]').send_keys('B站账号')
time.sleep(1)
driver.find_element(By.CSS_SELECTOR,'body > div.bili-mini-mask > div > div.bili-mini-content > div.bili-mini-login-wrapper > div.bili-mini-password-wrapper > div.bili-mini-password > div.left > input[type=password]').send_keys('密码')
time.sleep(2)
# 点击确定登录按钮
driver.find_element(By.CSS_SELECTOR,'body > div.bili-mini-mask > div > div.bili-mini-content > div.bili-mini-login-wrapper > div.bili-mini-login-register-wrapper > div.universal-btn.login-btn').click()
time.sleep(2)
# 获取验证码的元素,并进行截图。
image = driver.find_element(By.CSS_SELECTOR,'body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_panelshowclick > div.geetest_panel_next > div')
image.screenshot('yzm.png')
# 导入超级鹰,并输入账号,密码,软件ID
chaojiying = Chaojiying_Client('超级鹰账号', '密码', '软件ID') # 用户中心>>软件ID 生成一个替换 96001
im = open('yzm.png', 'rb').read() # 以二进制的方式读取验证码
result = chaojiying.PostPic(im, 9004)['pic_str'] #获取验证码的坐标字典,并取出坐标值
for index in result.split('|'): #以"|"进行分割,得到一个列表,并循环出每一个字的坐标
x = index.split(',')[0] # 得到x轴的坐标
y = index.split(',')[1] # 得到y轴的坐标
action = ActionChains(driver) #创建动作链对象
action.move_to_element_with_offset(image,int(x),int(y)).click().perform()
# image:验证码的元素框;x:验证码的横轴;y:验证码的纵轴
time.sleep(1)
time.sleep(1) # 加载一秒后在进行点击
driver.find_element(By.CSS_SELECTOR,'body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_panelshowclick > div.geetest_panel_next > div > div > div.geetest_panel > a > div').click()
注:该文章仅提供思路,如有错误欢迎指出。