准备工作
1、本次项目使用python3.9
2、安装selenium
pip install selenium
3、下载并配置chromdriver
3.2、选择合适版本的驱动下载,下载地址:http://chromedriver.storage.googleapis.com/index.html
3.3、解压下载的驱动放到指定目录(D:chromedriver_dir),代码调用时指定该目录即可。
from selenium import webdriver
chrome_driver = r"D:chromedriver_dir\chromedriver.exe"
url = "https://www.baidu.com/"
browser = webdriver.Chrome(executable_path=chrome_driver)
browser.get(url)
如果配置成功,运行上面代码可以打开网页百度
4、安装pillow、pytesseract,下载并安装Tesseract-OCR(这步是用来自动识别验证码的,后面发现并不是很准,还不如自己输入一下来的快)
4.1、安装pillow、pytesseract
pip install pillow pytesseract
4.2、下载并安装Tesseract-OCR,google找一下,下载安装
4.3、配置Tesseract-OCR,在Pythonxxx\Lib\site-packages\pytesseract下,编辑pytesseract.py,将
tesseract_cmd = 'tesseract' 改为: tesseract_cmd = 'OCR的安装路径下的tessract.exe'
def imgcode_auto_input(browser):
# 识别验证码
input_imgcode = browser.find_element(By.XPATH, '''// *[ @ id = "randomCode"]''')
input_imgcode.send_keys("")
sleep(1)
img = browser.find_element(By.XPATH, '''//*[@id="imgCode"]''')
browser.save_screenshot('screenshot.png')
left = img.location['x']
top = img.location['y']
right = img.size['width'] + left
height = img.size['height'] + top
screenshot = Image.open('screenshot.png')
imgcode = screenshot.crop((left, top, right, height))
imgcode.save('imgcode.png') # 这里就是截取到的验证码图片
image1 = Image.open('imgcode.png')
text = pytesseract.image_to_string(image1)
input_imgcode.send_keys(text)
主要功能
1、模拟用户登录
# 1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
chrome_driver_path = r"E:\pythonProject\autoclass\venv\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe"
browser = webdriver.Chrome(executable_path=chrome_driver_path)
url = r"https://jste.net.cn/uids/"
# 2.通过浏览器向服务器发送URL请求
browser.get(url)
# browser.get("https://www.baidu.com/")
sleep(1)
# 3.刷新浏览器
browser.refresh()
# 4.设置浏览器的大小
# browser.set_window_size(1400, 800)
browser.maximize_window()
# 5.用户登录
username_ = "xxx" # stands for !@user
password_ = "xxxxxx"
# 进入账户密码输入页面,找到用户密码框,填写内容
user = browser.find_elements(By.XPATH, '//*[@id="loginName"]')[0]
user.send_keys(username_)
sleep(1)
password = browser.find_elements(By.XPATH, '//*[@id="pwd"]')[0]
password.send_keys(password_)
sleep(1)
# 输入验证码
input_imgcode = browser.find_element(By.XPATH, '''//*[@id="randomCode"]''')
input_imgcode.send_keys("")
# 10秒时间内人工输入验证码并等待程序自动点击登录
sleep(10)
# 登录
submit = browser.find_element(By.XPATH, "/html/body/table[1]/tbody/tr[4]/td/form/input[4]")
submit.click()
sleep(1)
2、遍历目标路径,找到所有需要观看的视频,并观看到要求时间
def is_time_enough(text):
# text = '需要学习17分钟,已学习17分钟'
# 本项最少需要学习17分钟,最多记录17分钟,您已经学习17分钟。
need_time = float(re.search(r'需要学习(\d+)分钟', text).group(1))
learned_time = float(re.search(r'已经*学习(\d+)分钟', text).group(1))
if need_time <= learned_time:
return True
else:
return False
def watch_video(browser):
sleep(2)
print("start watching")
text = browser.find_element(By.XPATH, '''//*[@id="itemProgress"]''').text
while not is_time_enough(text):
sleep(60)
text = browser.find_element(By.XPATH, '''//*[@id="itemProgress"]''').text
print("stop watching")
def loop_floor(browser):
try:
videoList1 = browser.find_element(By.XPATH, '''/html/body/div[4]/div[2]'''
).find_elements(By.CLASS_NAME, 'item')
except:
return
try:
browser.find_element(By.XPATH, '//*[@id="videoPlayer"]')
watch_video(browser)
return
except:
for i in range(len(videoList1)):
try:
# video = browser.find_element(By.XPATH, '''/html/body/div[4]/div[2]'''
# ).find_elements(By.CLASS_NAME, 'item')[i]
video = browser.find_elements(By.XPATH, '''/html/body/div[4]/div[2]/div/a/div''')[i]
except:
continue
try:
video.click()
except:
continue
sleep(1)
loop_floor(browser)
browser.back()
sleep(1)
def main():
# 点击开始学习
browser.switch_to.frame('mainFrame') # 切换frame 坑1
start = browser.find_element(By.XPATH, '''/html/body/div[2]/div[2]/div/div[2]/ul/li[4]/a''')
start.click()
sleep(1)
# 切换新window 坑2
browser.switch_to.window(browser.window_handles[1])
sleep(1)
# 点击好的
ok = browser.find_element(By.XPATH, '/html/body/div[5]/div/div/div/div/div[2]/a[1]')
ok.click()
sleep(1)
# 进入根目录
root = browser.find_element(By.XPATH, '''/html/body/div[1]/div/ol/li[1]/a''')
root.click()
sleep(1)
loop_floor(browser)
遇到的一些坑
1、网页中出现frame时,一直无法定位元素,原来要切换到frame中才可以定位。
2、有个按钮会新开一个标签页,同样需要切换window到新的标签页才可以继续定位元素。
有待改进的地方TODO
1、可以增加一些条件进行剪枝。
2、增加一个进度条。
3、没想到了,很简单的脚本,以后再也不用苦逼地盯着网课了。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理