好友
阅读权限 20
听众
最后登录 1970-1-1
不负韶华
发表于 2020-6-6 09:39
用selenium和python的win32api 库实现了一个雨YU课堂自动预习 的脚本,第一次需要登录,会自动存储cookies,
全程只需要手动输入网址,和页数其他自动完成,
如果里面有题目的话,这个脚本还做不了哈 ,而且使用的时候鼠标 要放在浏览器窗口
,selenium没有实现鼠标滚轮滑动的库 。
有也是旁边要有scroll,而YU课堂没有 ,
就想到了win32api,但这也是缺陷,没有涉及底层的代码,
会js的小伙伴可以试一试用js完成中间的浏览步骤,可能代码更简洁。
下面放上代码,
仅供学习交流,不是偷懒的工具哦!!!!!!!!!!
# coding:utf-8
# time:2020.6.5.19:30
# auther: 小生
# website:
from selenium import webdriver
import time
import win32api
import win32con
from datetime import datetime
from datetime import timedelta
import random
import os
import json
""" 使用时,请将鼠标放到浏览器内,暂时没有想到更好的方法,要时刻观察控制台,
自动打开浏览器后会提示你输入网址,如果第一次使用,没有可供使用的 cookies,
那么控制台会提示登录, 30 秒足够了。没有设置 selenium 的页面等待,然后会自动
打开页面 , 然后控制台会提示输入页数,输入即可,鼠标放到浏览器窗口,你可以吃饭,
去上厕所,或者去玩,总之你开心就好。
"""
class Rainclass(object ):
driver_path = r"D:\Python\chromedriver\chromedriver.exe"
time_all = 0
num = 1
def __init__ (self ):
self .driver = webdriver.Chrome(executable_path =Rainclass.driver_path)
self .url = input (" 请输入要自动完成页面的网址: " )
# self.url = "https://changjiang.yuketang.cn/v2/web/studentCards"
self .driver.get(self .url)
def initial_judge (self ):
if os.path.exists("rainclass.txt" ): # 判断是否当前文件夹有存在存储 cookies 的文件
print ("cookies 存在 " )
self .send_cookies()
else :
self .get_cookies()
print ("cookies 不存在 " )
def get_cookies (self ):
print (" 将沉睡 30 秒,瞅啥呢,赶紧登录,老子要拿 cookies" )
time.sleep(30 )
distcookies = self .driver.get_cookies()
jsoncookies = json.dumps(distcookies)
with open ("rainclass.txt" , "w" )as fp:
fp.write(jsoncookies)
print (" 拿取 cookies 成功 , 正在进行下一步,登录 " )
time.sleep(1.5 )
self .send_cookies()
def send_cookies (self ):
with open ("rainclass.txt" , "r" , encoding ="utf-8" )as fp:
liscookies = json.loads(fp.read())
for cookie in liscookies:
cookie_dic = {
"domain" : "changjiang.yuketang.cn" ,
"expiry" : cookie.get("expiry" ),
"httpOnly" : cookie.get("httpOnly" ),
"name" : cookie.get("name" ),
"path" : "/" ,
"secure" : cookie.get("secure" ),
"value" : cookie.get("value" )
}
self .driver.add_cookie(cookie_dic) # 把 cookies 加入并刷新
self .driver.refresh()
time.sleep(2 ) # 别给人服务器造成太大压力
self .run()
def run (self ):
first_page = self .driver.find_element_by_xpath('//div[@class="ppt_img_box"]' )
first_page.click()
print (" 此页面将停留 2 秒,页面将自动打开,请将鼠标放在浏览器窗口 " )
# self.driver.set_window_size(1000,300000)
# self.driver.execute_script("window.scrollBy(0,1000)","")
all_page = int (input (" 请输入页数: " ))
selector = self .driver.find_element_by_xpath('//div[@class="slide_layer"]' )
selector.click()
time.sleep(3 )
# all_seconds = all_page*5+0.5
self .time0 = datetime.now()
while True :
# if datetime.now()-self.time0<timedelta(seconds=all_seconds): # 起初固定秒数,后来发现这样有的预习不上,变成随机选择
""" 一开始固定秒数,后来发现这样有的预习不上,变成随机选择,
一开始是通过对比时间差来判断是否完成预习, 0.5 秒是容
错量,防止因为网络原因预习不上。
后来改成了更傻的方式,直接判断页数。
下面选择的列表我闹着玩的,完全可以 random.randit 哈。
"""
if self .num < all_page:
win32api.mouse_event(win32con.MOUSEEVENTF_WHEEL, 0 , 0 , -1 )
time_li = [4 , 4.2 , 4.3 , 4.4 , 4.5 , 4.6 , 4.7 , 4.8 , 4.9 , 5 , 5.21 , 5.3 , 5.4 , 5.5 , 5.6 , 5.7 , 7.8 , 5.9 , 6 ]
time_rand = random.choice(time_li)
time.sleep(time_rand)
print (str (" 预习秒数为: " )+str (time_rand))
# self.time_all = self.time_all+time_rand
self .num+=1
print (" 第 {} 页可能已经预习完成 " .format(self .num))
else :
print ("*" *20 +" 预习可能已经完成 " +"*" *20 )
print ("*" *20 +" 预习可能已经完成 " +"*" *20 )
break
if __name__ == '__main__' :
clas = Rainclass()
clas.initial_judge()
大概的样子
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。