初学者怎么做一个简单的自动化脚本
文章目录
- 初学者怎么做一个简单的自动化脚本
- 初学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的原因是因为每一节课都有播放时间 ,肯定要等他们播放。完了,再点击下一节课呀
三.总结
这就是一个简单的脚本,学会了可以做一些简单的脚本,来提高自己的学习兴趣,但是这个还有很多的不足。