Python+Selenium 实现自动挂网课脚本

发表于:2023-4-14 09:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:zzzzzzk    来源:知乎

  准备工作
  1、本次项目使用python3.9
  2、安装selenium
  pip install selenium
  3、下载并配置chromdriver
  3.1、打开谷歌浏览器, 在地址栏输入 chrome://version/ 查看版本信息
  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),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号