提示:本篇基于selenium做的一个的脚本,由于我的技术比较有限,所以比较适合初学者学习:
大家好,我是一名大二的学生,由于暑假学习了python,只学python这些语法是非常枯燥的,学习python的一些库才能做出一些有趣的项目,所以就在b站上学习爬虫,学习的过程中发现selenium可以操作浏览器,就想实现自己帮我点击播放视频,实现自动化网课,抱着这样的目的去学习,最终实现了,结果没刷几个视频就给我封号了,啊哈哈哈哈哈,也就一周吧。但是这样的成就增加了我学习编程的兴趣。
Selenium是一个开源工具,用于自动执行在Web浏览器上执行的测试(可以使用任何Web浏览器进行Web应用程序的测试)。
安装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)
学习八大元素定位可以去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()
浏览器中的元素要么是输入数据,要么是点击,这样就能让机器自动操作了
这里有一个验证码识别 的难题
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()
这个模块能实现大部分数字字母验证码的识别,还是挺不错的,也可以选择网上的云打码平台,但是需要付费。
能实现验证码的识别,要想怎么把验证码保存成图片呢?
肯定不能手动保存,为什么呢?因为手动保存的验证码图片会改变,每一次刷新页面验证码图片都改变了,所以就要想其他方法。
我了解到了一个方法就是把有验证码的那个网页截屏保存下来(这里最好设置浏览器全屏化,上面有提到,方便截图,截取验证码出来),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(验证码)
这样就解决了验证码的问题,没有验证码更好解决
就以一个网站为例
就以第一节和第二节课为例看看他们的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的原因是因为每一节课都有播放时间 ,肯定要等他们播放。完了,再点击下一节课呀
这就是一个简单的脚本,学会了可以做一些简单的脚本,来提高自己的学习兴趣,但是这个还有很多的不足。