一. 前言
在学习Selenium之前,通过request.get()或者.post(),很难获取网站所加载的动态数据,通过Selenium强大的自动化功能、多浏览器支持、跨平台支持等优点,让我轻松获取一些之前很难获取的数据,这次的案例也是结合之前的所学知识完成
二. 开始前提
需要下载selenium,以及对应浏览器版本的驱动webdriver,PIL库,selenium,和PIL库都好下载,只需通过python内置的下载,打开python左上角的File里的
setting,进入project:你的项目名下的Python Interpreter
然后再点击那个小" + "号,在搜索需要下载的库就行了,点击Install Package进行下载
tips:pil如果不能下载,可能是pip的版本过低,控制台输入python -m pip install --upgrade pip即可
如果使用默认,是国外下载源下载太慢,点击Manage Repositories 在里边可以输入国内的下载源速度更快,我这里就分享一个国内的https://pypi.tuna.tsinghua.edu.cn/simple/
浏览器我使用的是谷歌的浏览器,尽量去根据浏览器驱动版本去下载对应的版本的浏览器,因为这谷歌的浏览器的自动更新版本实在太头疼,一更新就和驱动版本不对应,导致程序报错,建议就是避免下载最新版本的浏览器,可能会没有相应的驱动
2.1 114及之前的版本可以通过点击下载chromedriver,根据版本号(只看大版本)下载对应文件
三、模拟登陆网站
1.导库
from PIL import Image
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
from selenium.webdriver.common.by import By
2. 打开网站
# 配置选项
options = Options()
#模拟浏览器登录
options.add_experimental_option('detach',True)
# 实现规避检测
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 初始化浏览器
driver = webdriver.Chrome(options=options)
# 使打开的屏幕最大化
driver.maximize_window()
# 打开网站
driver.get('https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx')
四、验证码的处理
1.屏幕截图
自己使用selenium进行自动化登录的难点还是在于验证码图片的如何获取保存?前期使用request.get()或者是driver.page_source都只能获取到请求之后的验证码图片,下载保存验证码图片早已刷新,跟在页面显示的验证码图片完全不一样,为了解决这个问题,可以使用selenium的屏幕截图的功能,在根据PIL库来对图形进行处理
# 获取页面宽度与高度
hight, width = 'return document.body.clientHeight', 'return document.body.clientWidth'
h, w = driver.execute_script(hight), driver.execute_script(width)
print(w, h)
# 指定四个点的坐标,这里以左上角和右下角的坐标为例
# x1起始宽度到 x2最大宽度的距离
# y1起始高度到 y2最大高度的距离
x1, y1 = 790, 240 # 左上角坐标
x2, y2 = 870, 300 # 右下角坐标
# 获取整个页面截图
screenshot_path = 'screenshot.png'
driver.save_screenshot(screenshot_path)
这里的x,y需要具体根据验证码的页面位置来调节,也可以通过F12网页元素坐标,
在CONSOLE窗口中,输入document.getElementById('元素ID').getBoundingClientRect()
回车,即可查看在屏幕的位置;通过点击调试模式右上角的……。,选择“悬浮模式”,不影响实际的像素数
给出的具体数据也是仅供参考吧,实际截取的具体验证码的位置还得自己慢慢调节
2.保存截图
# 截取指定区域
im = Image.open(screenshot_path)
region = im.crop((x1, y1, x2, y2))
# 保存截图
cropped_path = 'result_screenshot.png'
region.save(cropped_path)
3.获取验证码
如何获取图片的当中的验证码?根据自己或者人工肉眼来获取有点麻烦,那么就通过第三方验证码识别平台,这里我就推荐超级鹰,比起其他的使用方便快捷很多,关键是新手注册送1000积分,可以供自己测试很多次了,另外1000积分也只要1块,也是相当给力了
那么如何使用这个第三方平台呢?首先注册一个账号,让后下载python的语言Demo,把他解压在项目的文件夹中
将这个chaojiying.py剪切到当前目录就行,然后可以将文件的if __name__=="__main__"下边注释掉,复制到刚才编写的代码中,使用这个py文件,只需从外边导入就行
from chaojiying import Chaojiying_Client
if __name__ == '__main__':
chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001') #用户中心>>软件ID 生成一个替换 96001
im = open('a.jpg', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print chaojiying.PostPic(im, 1902) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
#print chaojiying.PostPic(base64_str, 1902) #此处为传入 base64代码
根据使用说明填写自己账号和密码,以及软件id
另外需要把def PostPicf返回为 r.josn值改为,result['pic_str'],就是我截取到图片中的验证码的值
以及软件id在用户中心里面
4.模拟登录
最终我们只需要利用selenium的xpath获取标签的具体位置,然后填写我们获取的数据,就能够自动登录了
driver.find_element(By.XPATH,'//*[@id="email"]').send_keys("登录网站账号")
driver.find_element(By.XPATH,'//*[@id="pwd"]').send_keys("登录网站密码")
driver.find_element(By.XPATH,'//*[@id="code"]').send_keys(img_code)
driver.find_element(By.XPATH,'//*[@id="denglu"]').click()
print("登录成功!!!")
以下是完整代码,可以供你们参考
from PIL import Image
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
from selenium.webdriver.common.by import By
from chaojiying import Chaojiying_Client
# 配置选项
options = Options()
options.add_experimental_option('detach',True)
# 设置使用无头浏览器
# options.add_argument("--headless")
# 实现规避检测
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 初始化浏览器
driver = webdriver.Chrome(options=options)
# 使打开的屏幕最大化
driver.maximize_window()
driver.get('https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx')
# 获取页面宽度与高度
hight, width = 'return document.body.clientHeight', 'return document.body.clientWidth'
h, w = driver.execute_script(hight), driver.execute_script(width)
print(w, h)
# 指定四个点的坐标,这里以左上角和右下角的坐标为例
# x1起始宽度到 x2最大宽度的距离
# y1起始高度到 y2最大高度的距离
x1, y1 = 790, 240 # 左上角坐标
x2, y2 = 870, 300 # 右下角坐标
# 获取整个页面截图
screenshot_path = 'screenshot.png'
driver.save_screenshot(screenshot_path)
# 截取指定区域
im = Image.open(screenshot_path)
region = im.crop((x1, y1, x2, y2))
# 保存截图
cropped_path = 'result_screenshot.png'
region.save(cropped_path)
chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001') #用户中心>>软件ID 生成一个替换 96001
im = open('result_screenshot.png', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
img_code=chaojiying.PostPic(im, 1004)
print ("识别的验证码为"+img_code)
driver.find_element(By.XPATH,'//*[@id="email"]').send_keys("登录网站账号")
driver.find_element(By.XPATH,'//*[@id="pwd"]').send_keys("登录网站密码")
driver.find_element(By.XPATH,'//*[@id="code"]').send_keys(img_code)
driver.find_element(By.XPATH,'//*[@id="denglu"]').click()
print("登录成功!!!")
五.总结
感兴趣的话还可以尝试以下其他的网站进行模拟自动登录,以后可以方便的进行各个软件的登录啦,Selenium真是一个强大的测试工具