python应用之selenium做自动化

初学者怎么做一个简单的自动化脚本


提示:本篇基于selenium做的一个的脚本,由于我的技术比较有限,所以比较适合初学者学习:

文章目录

  • 初学者怎么做一个简单的自动化脚本
  • 初学python
  • 一、selenium是什么?
  • 二、前期准备
    • 2.1 selenium的使用
    • 2.2 实现元素定位
    • 2.3 解决识别验证码的问题
    • 2.4 把验证码图片保存下来
    • 2.5 实现自动化
  • 三.总结

初学python

大家好,我是一名大二的学生,由于暑假学习了python,只学python这些语法是非常枯燥的,学习python的一些库才能做出一些有趣的项目,所以就在b站上学习爬虫,学习的过程中发现selenium可以操作浏览器,就想实现自己帮我点击播放视频,实现自动化网课,抱着这样的目的去学习,最终实现了,结果没刷几个视频就给我封号了,啊哈哈哈哈哈,也就一周吧。但是这样的成就增加了我学习编程的兴趣。

一、selenium是什么?

Selenium是一个开源工具,用于自动执行在Web浏览器上执行的测试(可以使用任何Web浏览器进行Web应用程序的测试)。

二、前期准备

2.1 selenium的使用

安装selenium模块,就导入以下模块就可以了

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import EdgeOptions

以下代码就是创建浏览器对象,并实现反反爬,可以用起

#实现规避检测爬虫
option = EdgeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Edge("./msedgedriver.exe", options=option)
#设置浏览器全屏化
driver.maximize_window()  #为什么实现浏览器全屏化咋后面再说

使用time.sleep需要导入 import time,为什么使用这个呢?
简单来说就是可能会因为网速的问题,该页面没加载,就开始点击浏览器某个元素,然而该元素又没有出现,就导致出现一些问题,所以用time.sleep来让程序停一下,在执行下一个程序。
driver.get(“里面填你要打开的网站”)

driver.get("")
time.sleep(1.2)

2.2 实现元素定位

学习八大元素定位可以去b站学习,,也可以看官方文档 Selenium-Python中文文档
我一般用xpath定位例如:
![在这里插入图片描述](https://img-blog.csdnimg.cn/13cda48506f94337a4894d28f72b2a17.png#pic_center![在这里插入图片描述](https://img-blog.csdnimg.cn/1404ba1aa6704dd48cd11f5f14d0a641.png#pic_center在这里插入图片描述

鼠标右键复制它的xpath路径
账号,密码,验证码同样如此

#send_keys是向这个框输入这个数据
driver.find_element(By.XPATH,'//*[@id="username"]').send_keys("2111030***")
driver.find_element(By.XPATH,'//*[@id="password"]').send_keys("a123****")

在这里插入图片描述

这个登录是需要点击的,点击的代码:

driver.find_element(By.XPATH,'//*[@id="loginForm"]/div/div[5]/div/input[2]').click()

浏览器中的元素要么是输入数据,要么是点击,这样就能让机器自动操作了
这里有一个验证码识别 的难题

2.3 解决识别验证码的问题

import ddddocr
#识别验证码
def code():
    ecr = ddddocr.DdddOcr()
    with open("code.png","rb") as f:
        img = f.read()
    result = ecr.classification(img)
    print("结果是:",result)
    return result
code()

这个模块能实现大部分数字字母验证码的识别,还是挺不错的,也可以选择网上的云打码平台,但是需要付费。

能实现验证码的识别,要想怎么把验证码保存成图片呢?
肯定不能手动保存,为什么呢?因为手动保存的验证码图片会改变,每一次刷新页面验证码图片都改变了,所以就要想其他方法。

2.4 把验证码图片保存下来

我了解到了一个方法就是把有验证码的那个网页截屏保存下来(这里最好设置浏览器全屏化,上面有提到,方便截图,截取验证码出来),selenuim就有一个方法可以截取整张页面,但还需要 把整张页面截屏的验证码那一块单独再截取出来

#保存整张界面的代码
 driver.save_screenshot("a.png")

截取局部验证码就需要以下代码
driver.find_element(By.XPATH,‘/html/body/div/div[2]/div[2]/div/form/div/div[3]/div[2]/span[2]/img’)这串代码的作用就是找到验证码的元素定位。
在这里插入图片描述

这里我讲一讲k值的作用,不调整k值的大小,你会发现验证码元素定位也定正确了,可就是截取不到验证码图片,这就跟你自己电脑的缩放比例有关系了,我的是125%,所以k值为1.25.,如果还有一点误差就自己调。
在这里插入图片描述

#确定验证码的坐标
code_png_lel = driver.find_element(By.XPATH,'/html/body/div/div[2]/div[2]/div/form/div/div[3]/div[2]/span[2]/img')
location = code_png_lel.location  #验证码左上的 x,y
size = code_png_lel.size  #宽度
print('location',location)
print(size)
k = 1.25
#图片左上角和右下角的xy坐标
rangle = (
    int(location['x'])*k, int(location['y'])*k, int(location['x']+size['width'])*k, int(location['y']+size['height'])*k
)
#验证码区域确定好了

整张页面保存下来后,截取验证码图片,导入from PIL import Image 这个

 #对全局页面进行截图获取局部验证码
i = Image.open('./a.png')   #打开的是那张拥有验证码的整张界面的图片
#按照给定xy坐标裁剪
code_image_name = "code.png"   #给这个验证码图片取一个名
frame = i.crop(rangle) #---》上面找到了验证码元素的位置,用来保存
frame.save(code_image_name)		#保存图片

以下图片就是从整张界面截取验证码图片的例子
在这里插入图片描述

截取成功验证码图片后就可以用 2.3解决验证识别问题解决验证码识别,然后把识别后的验证码driver.find_element(By.XPATH,“那个元素框”).send_keys(验证码)
这样就解决了验证码的问题,没有验证码更好解决

2.5 实现自动化

就以一个网站为例
在这里插入图片描述

在这里插入图片描述

就以第一节和第二节课为例看看他们的xpath
1–> //[@id=“wrapper”]/div[2]/div/div[1]/div[2]/div/div[2]/div[1]
2–>//
[@id=“wrapper”]/div[2]/div/div[1]/div[2]/div/div[2]/div[2]
发现他们就后面那个div中的数字不一样,并且对应着节数,利用这个特性不就可以定位元素进行点击,利用一个for循环来做。

for i in range(12,15):  #这边的数字就对应的你要刷哪一节课,就点击那一节
    try:
        driver.find_element(By.XPATH,'//*[@id="wrapper"]/div[2]/div/div[1]/div[2]/div/div[2]/div[{}]/a'.format(i)).click()
        time.sleep(1)
        driver.find_element(By.XPATH,'//*[@id="videoContent"]/div/div[9]/canvas').click()
        time.sleep(2.3)
        driver.find_element(By.XPATH,'//*[@id="layui-layer1"]/div[2]/div/div[2]/input[2]').send_keys(sava_img1())
        driver.find_element(By.XPATH,'//*[@id="layui-layer1"]/div[3]/a[1]').click()
    except:
        time.sleep(1)
        driver.find_element(By.XPATH, '//*[@id="videoContent"]/div/div[9]/canvas').click()
        time.sleep(1)
    if i==12:
        time.sleep(60*20)
    elif i==12:
        time.sleep(60*22)
    elif i==13:
        time.sleep(60*22)
    elif i==14:
        time.sleep(60*20)

这里我说一下为什么加异常处理,这是因为刷课的时候需要输入验证码,但是也可能有几节不需要输入验证码,不加异常处理 ,它找不到这个元素,那么这个程序不就报错了嘛,如果没有出现这个验证码元素就执行except中的代码,就进行简单的点击就行了

加time.sleep的原因是因为每一节课都有播放时间 ,肯定要等他们播放。完了,再点击下一节课呀

三.总结

这就是一个简单的脚本,学会了可以做一些简单的脚本,来提高自己的学习兴趣,但是这个还有很多的不足。