一、扫码登陆
1.login.py
import time
import urllib
from selenium import webdriver
from selenium.webdriver.common.by import By
from datetime import datetime
import os
def login():
browse = webdriver.Chrome()
# 打开登录页面的网址,即第二个iframe
login_url = "https://login.xuexi.cn/login/xuexiWeb?appid=dingoankubyrfkttorhpou&goto=https%3A%2F%2Foa.xuexi.cn&type=1&state=8a54e186b6084e0fOGGda0FzKExz-lV5tK-2RCZGZPly8ttbQz2YkWXb37jldQRL1ZSJ1UXNTxaA0IWb&check_login=https%3A%2F%2Fpc-api.xuexi.cn"
browse.get(url=login_url)
# 窗口最大化
browse.maximize_window()
# 通过获取get_attribute()方法获取二维码链接
QR_code_url = browse.find_element(By.XPATH,'//div[@id="app"]//img').get_attribute('src')
# 获取当前时间
current_time = datetime.now().strftime("%H点%M分")
print(current_time)
# 下载二维码到本地
urllib.request.urlretrieve(QR_code_url, filename=f'{current_time}.jpg')
print("下载完成")
# 暂停10s,用手机扫码登陆
time.sleep(10)
os.remove(f'{current_time}.jpg')
browse.get("https://pc.xuexi.cn/points/my-study.html")
# time.sleep(100)
return browse
if __name__ == "__main__" :
login()
二、选读文章模块
get_reading_score.py
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from login import login
from selenium.webdriver.common.by import By
def get_reading_score():
browse = login()
# 点击"学习积分"按钮,会跳转到新的窗口
xue_xi_ji_fen = browse.find_element(By.XPATH, '//div[@class="text-title"]/span[contains(text(),"学习积分")]')
xue_xi_ji_fen.click()
# 获取所有窗口句柄
all_window_handles = browse.window_handles
# 切换到新打开的窗口,新窗口句柄是列表中的最后一个
new_window_handle = all_window_handles[-1]
browse.switch_to.window(new_window_handle)
# "我要选读文章"模块
try:
wait = WebDriverWait(browse, 10).until(EC.presence_of_element_located(
(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[3]/div[2]/div[2]//div[@class="big"]')))
# 定位到"我要选读文章"模块
qu_kan_kan = browse.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[3]/div[2]/div[2]//div[@class="big"]')
# 点击"去看看",不会出现新的窗口句柄,直接在同一个窗口跳转,改变URL
qu_kan_kan.click()
except Exception as ec:
print("未找到元素")
# 每有效阅读一篇积1分,上限6分
# 有效阅读文章累计1分钟积1分,上限6分
try:
i = 1
for i in range(1, 8):
# 先确定新页面是否加载完成
wait = WebDriverWait(browse, 10).until(EC.presence_of_element_located(
(By.XPATH, ' // div // span[contains(text(), "重要新闻")]')))
# print("找到'重要新闻'按钮的位置")
# 开始阅读新闻,每条新闻是有序排放的,只需改变列表中的div[{i}]即可自动跳转到下一条新闻
read_news = browse.find_element(By.XPATH,
f'//*[@id="231c"]/div/div/div/div/div/section/div/div/div/div/div[2]/section/div/div/div/div[1]/div[{i}]/div/div/div/span')
read_news.click()
# 阅读新闻会打开新的窗口,获取所有窗口列表
all_window_handles = browse.window_handles
# print(f"所有窗口列表如下:{all_window_handles}")
# 切换到新窗口,新窗口句柄是列表中的最后一个
new_window_handle = all_window_handles[-1]
browse.switch_to.window(new_window_handle)
# 在新窗口停留70s 拿1积分
time.sleep(5)
# 拉动页面滚动栏,拉到1/3
browse.execute_script("window.scrollTo(0, document.body.scrollHeight / 3);")
print(f"正在阅读第{i}条新闻")
time.sleep(5)
# 拉动页面滚动栏,拉到底部
browse.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(60)
# print(f"当前窗口:{new_window_handle}")
# 关闭正在阅读的新闻窗口并返回上一个
browse.close()
# 切回上一个窗口
previous_window_handle = all_window_handles[-2]
browse.switch_to.window(previous_window_handle)
if i == 6:
print('顺利完成"我要选读文章"模块积分获取')
except Exception as ec:
print('"我要选读文章"模块出现异常')
return browse
if __name__ == "__main__":
get_reading_score()
三、视听学习模块
get_video_score.py
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from login import login
from selenium.webdriver.common.by import By
def get_video_score():
browse = login()
# 点击"学习积分"按钮,会跳转到新的窗口
xue_xi_ji_fen = browse.find_element(By.XPATH, '//div[@class="text-title"]/span[contains(text(),"学习积分")]')
xue_xi_ji_fen.click()
# 获取所有窗口句柄
all_window_handles = browse.window_handles
# 切换到新打开的窗口,新窗口句柄是列表中的最后一个
new_window_handle = all_window_handles[-1]
browse.switch_to.window(new_window_handle)
try:
wait = WebDriverWait(browse, 10).until(EC.presence_of_element_located(
(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[3]/div[2]/div[3]//div[@class="big"]')))
# 定位到"我要视听学习"模块
qu_kan_kan = browse.find_element(By.XPATH, '//*[@id="app"]/div/div[2]/div/div[3]/div[2]/div[3]//div[@class="big"]')
# 点击"去看看",不会出现新的窗口句柄,直接在同一个窗口跳转,改变URL
qu_kan_kan.click()
except Exception as ec:
print("未找到元素")
# 每有效收听/观看一个积1分,上限6分,
# 有效收听音频或观看视频累计1分钟积1分,上限6分
try:
i = 1
for i in range(1, 7):
wait = WebDriverWait(browse, 10).until(
EC.presence_of_element_located((By.XPATH, '//div//span[contains(text(),"县级融媒")]')))
video_news = browse.find_element(By.XPATH,
f'//*[@id="6ho1do4x5n"]/div/div/div/div/div/section/div/div/div/div/div[2]/section/div/div/div/div[{i}]/div/div/div/div/span')
video_news.click()
# 视听新闻会打开新的窗口,获取所有窗口列表
all_window_handles = browse.window_handles
new_window_handle = all_window_handles[-1]
# 切换到新窗口,新窗口句柄是列表中的最后一个
browse.switch_to.window(new_window_handle)
# 如果是新闻页面,则点击播报按钮
try:
wait = WebDriverWait(browse, 10).until(
EC.presence_of_element_located((By.XPATH,
'//*[@id="root"]/div/section/div/div/div/div/div[2]/section/div/div/div/div/div/div/div[2]/div/span[4]/div/button')))
print(f"第{i}次播放试听新闻")
play_button = browse.find_element(By.XPATH,
'//*[@id="root"]/div/section/div/div/div/div/div[2]/section/div/div/div/div/div/div/div[2]/div/span[4]/div/button')
play_button.click()
time.sleep(5)
browse.execute_script("window.scrollTo(0, document.body.scrollHeight / 3);")
time.sleep(5)
browse.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(180)
except Exception as ec:
print(f"第{i}次执行打开的是视频")
time.sleep(5)
browse.execute_script("window.scrollTo(0, document.body.scrollHeight / 3);")
time.sleep(180)
browse.close()
# 切回上一个窗口
previous_window_handle = all_window_handles[-2]
browse.switch_to.window(previous_window_handle)
except Exception as ec:
print('"我要视听学习"模块出现异常')
if __name__ == "__main__":
get_video_score()