由于是 web 应用免不了 web 三大件,html、css、js。当然至少了解一下 html 即可,重点是 Dom 相关操作得了解一下,不然看着硕大的网页源码容易晕头转向。然后由于本文定位元素主要就是通过xpath 进行元素定位的,所以 xpath 是很有必要了解一下的。最后当然就提到了我们的程序设计语言 pyhon 啦,当然学会基本的函数处理即可,不涉及面向对象模块。
首先,编程环境选择的是主流的pycharm环境,优缺点自然不用多说。然后 web 浏览器选择了谷歌浏览器,但是谷歌浏览器的缺点就是,进行自动化的时候,需要下载驱动(查看本地浏览器版本,下载对应驱动即可。)
本程序功能,有以下几点:
这个程序逻辑其实很简单,就是模拟人怎么取评价的,记住人每一步的操作就可以了,具体需要分析的就是 3 点
这里依赖库主要用到的就是 selenium 库,库里的功能主要是
其次应该注意的是,pytesseract+PIL库可以帮助有效解决验证码识别问题,当然验证码识别需要依赖的系统是基于java 开发的一个 OCR,通过 pytesseract 连接使用即可,没有涉及太复杂的内容。
还有一些其他的库,以下是它们在本程序中所扮演的功能简述。
代码如下:
from selenium import webdriver
import time
import pytesseract
from PIL import Image
import re # 用于正则
import os
直接从主函数开始,了解程序大体上进行了哪些工作,首先是加载驱动,由于 Google 浏览器的弊端,不同的版本要下载不同驱动,然后是输入一些基本信息,比如访问的浏览地址,用户名,密码等。
接着就可以开始尝试登录了,调用 login 函数,当然运行到这里由于本程序在图片识别上有比较大的问题,直接利用的原生的 OCR 系统,识别效果比较差,当然由于目标的图片内容比较简单,只需要反复运行几次就可以登录成功,就偷懒了。如果想要使得程序能够比较好的处理图片的话,笔者建议从以下方向进行优化:
然后是进入课程学习目录界面的函数 go_to_my_course,这个就是一些跳转,在这个函数里一定要注意页面刷新的问题,主要通过 time.sleep() 来解决。
最后就是一个比较复杂的函数 evaluate 即可开始评价。这里面多次涉及 xpath 定位元素的操作,这里简单介绍一下如何快速获得 xpath:
主函数代码如下:
if __name__ == '__main__':
chrome_driver = r'xxx'
os.environ["webdriver.chrome.driver"] = chrome_driver
driver = webdriver.Chrome(chrome_driver)
# 登录网页
url = 'xxx'
driver.get(url)
# 用户名,密码
user = 'xxx'
password = 'xxx'
# 登录
login(driver, user, password)
# 进入课程学习
go_my_course(driver)
# 进行评价和时长
evaluate(driver)
# 爬取题目
#'spider_text(driver)'
# 进行刷题
def login(driver, user, password):
time.sleep(5)
driver.find_element_by_xpath('/html/body/div[2]/div/div/ul/li[4]/a[1]').click() # 登录窗口
driver.switch_to.frame('pageiframe')
# 输入账号
driver.find_element_by_xpath('//').send_keys(user)
# 输入密码
driver.find_element_by_xpath('//').send_keys(password)
# 输入验证码
driver.find_element_by_xpath('//').send_keys(check_code())
# 登录按钮
driver.find_element_by_xpath('//').click()
return True
def go_my_course(driver):
try:
time.sleep(3) # 跳转页面
# 进入个人中心
driver.find_element_by_xpath('/html/body/div[2]/div/div/ul/li[4]/a').click()
# 点我的课程
driver.find_element_by_xpath('//').click()
# 进入学习
driver.find_element_by_xpath('//').click()
# 切换新网页句柄
wins = driver.window_handles
driver.switch_to.window(wins[1])
# time.sleep(5) # 跳转页面
# 点击课程学习
driver.find_element_by_xpath("//").click()
return True
except:
print('进入失败,重新运行代码')
# 媒体评价和时长
def evaluate(driver):
try:
# 第 i 章
for i in range(538, 551):
strTitle = '//' + str(i) + '"]'
# driver.find_element_by_xpath(strTitle).click() # 点击第 i 章
test = driver.find_element_by_xpath(strTitle)
driver.execute_script("arguments[0].click();", test)
# 这里因为定位小节时 id 改变了
strTitle2 = '//' + str(i) + '"]'
strNode = strTitle2 + '/ul/li'
le = len(driver.find_elements_by_xpath(strNode)) # 每个章的小节数量不同
# 依次点击 k 小节下的 a 标签
for k in range(1, le + 1):
strA = strNode + str([k]) + '/a'
# driver.find_element_by_xpath(strA).click()
test2 = driver.find_element_by_xpath(strA)
driver.execute_script("arguments[0].click();", test2)
time.sleep(2)
# a 标签下的媒体评价
# 根据 ‘马上评价’文本定位节点
strEvaluate = '// / div[1] / dl / dd / p / a / span / span[contains(text(), "马上评价")]'
dr = driver.find_elements_by_xpath(strEvaluate)
# 每个文本进行点击
for j in range(0, len(dr)):
strEvaluate = '/// div[1] / dl / dd / p / a / span / span[contains(text(), "马上评价")]'
drChild = driver.find_element_by_xpath(strEvaluate)
drChild.click()
# 对弹出页面进行操作
## 点击很好
## 转到 iframe
driver.switch_to.frame('pageiframe')
strGood = '/html/body/div[2]/div/div[2]/div/p/input[3]'
time.sleep(2)
driver.find_element_by_xpath(strGood).click()
### 点击确定,没有确定则不管
try:
strSure = '/html/body/div[1]/div/table/tbody/tr[2]/td[2]/div/table/tbody/tr[3]/td/div/button[1]'
driver.find_element_by_xpath(strSure).click()
time.sleep(2)
finally:
# 转到主界面, 才能关闭 iframe
driver.switch_to.parent_frame()
# 关闭弹出页面, 进行下一次评价
strClose = '/html/body/div[1]/div/table/tbody/tr[2]/td[2]/div/table/tbody/tr[1]/td/div/a'
driver.find_element_by_xpath(strClose).click()
time.sleep(2)
time.sleep(2)
time.sleep(2)
return True
except:
print('评价失败,重新运行代码')
本次实验基于用户行为,模拟了人工智能。
在这里主要提出以下缺点,以及它们的改进措施
from selenium import webdriver
import time
import pytesseract
from PIL import Image
import re # 用于正则
import os
# 验证码识别
def check_code():
# 通过截图来获取验证码
checkCode = driver.find_element_by_xpath('//')
checkCode.screenshot('checkZS2.png')
imageObject = Image.open('checkZS2.png')
result = pytesseract.image_to_string(imageObject) # 图片转文字
resultj = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])", "", result) # 去除识别出来的特殊字符
result_four = resultj[0:4] # 只获取前4个字符 # 登录功能
return result_four
def login(driver, user, password):
time.sleep(5)
driver.find_element_by_xpath('/html/body/div[2]/div/div/ul/li[4]/a[1]').click() # 登录窗口
driver.switch_to.frame('pageiframe')
# 输入账号
driver.find_element_by_xpath('//').send_keys(user)
# 输入密码
driver.find_element_by_xpath('//').send_keys(password)
# 输入验证码
driver.find_element_by_xpath('//').send_keys(check_code())
# 登录按钮
driver.find_element_by_xpath('//').click()
return True
# 进入课程学习界面
def go_my_course(driver):
try:
time.sleep(3) # 跳转页面
# 进入个人中心
driver.find_element_by_xpath('/html/body/div[2]/div/div/ul/li[4]/a').click()
# 点我的课程
driver.find_element_by_xpath('///div/div[1]/dl/dd[9]/a').click()
# 进入学习
driver.find_element_by_xpath('///div/table/tbody/tr[2]/td[6]/a').click()
# 切换新网页句柄
wins = driver.window_handles
driver.switch_to.window(wins[1])
# time.sleep(5) # 跳转页面
# 点击课程学习
driver.find_element_by_xpath("///div[2]/div/a[2]").click()
return True
except:
print('进入失败,重新运行代码')
# 媒体评价和时长
def evaluate(driver):
try:
# 第 i 章
for i in range(538, 551):
strTitle = '//' + str(i) + '"]'
# driver.find_element_by_xpath(strTitle).click() # 点击第 i 章
test = driver.find_element_by_xpath(strTitle)
driver.execute_script("arguments[0].click();", test)
# 这里因为定位小节时 id 改变了
strTitle2 = '//' + str(i) + '"]'
strNode = strTitle2 + '/ul/li'
le = len(driver.find_elements_by_xpath(strNode)) # 每个章的小节数量不同
# 依次点击 k 小节下的 a 标签
for k in range(1, le + 1):
strA = strNode + str([k]) + '/a'
# driver.find_element_by_xpath(strA).click()
test2 = driver.find_element_by_xpath(strA)
driver.execute_script("arguments[0].click();", test2)
time.sleep(2)
# a 标签下的媒体评价
# 根据 ‘马上评价’文本定位节点
strEvaluate = '// / div[1] / dl / dd / p / a / span / span[contains(text(), "马上评价")]'
dr = driver.find_elements_by_xpath(strEvaluate)
# 每个文本进行点击
for j in range(0, len(dr)):
strEvaluate = '/// div[1] / dl / dd / p / a / span / span[contains(text(), "马上评价")]'
drChild = driver.find_element_by_xpath(strEvaluate)
drChild.click()
# 对弹出页面进行操作
## 点击很好
## 转到 iframe
driver.switch_to.frame('pageiframe')
strGood = '/html/body/div[2]/div/div[2]/div/p/input[3]'
time.sleep(2)
driver.find_element_by_xpath(strGood).click()
### 点击确定,没有确定则不管
try:
strSure = '/html/body/div[1]/div/table/tbody/tr[2]/td[2]/div/table/tbody/tr[3]/td/div/button[1]'
driver.find_element_by_xpath(strSure).click()
time.sleep(2)
finally:
# 转到主界面, 才能关闭 iframe
driver.switch_to.parent_frame()
# 关闭弹出页面, 进行下一次评价
strClose = '/html/body/div[1]/div/table/tbody/tr[2]/td[2]/div/table/tbody/tr[1]/td/div/a'
driver.find_element_by_xpath(strClose).click()
time.sleep(2)
time.sleep(2)
time.sleep(2)
return True
except:
print('评价失败,重新运行代码')
# 获得题目
def spider_text(driver):
for i in range(538, 551):
strTitle = '//' + str(i) + '"]'
# driver.find_element_by_xpath(strTitle).click() # 点击第 i 章
test = driver.find_element_by_xpath(strTitle)
driver.execute_script("arguments[0].click();", test)
# 这里因为定位小节时 id 改变了
strTitle2 = '//' + str(i) + '"]'
strNode = strTitle2 + '/ul/li'
le = len(driver.find_elements_by_xpath(strNode)) # 每个章的小节数量不同
# 定位到 k 小节
for k in range(1, le + 1):
strA = strNode + str([k]) + '/a'
# driver.find_element_by_xpath(strA).click()
test2 = driver.find_element_by_xpath(strA)
driver.execute_script("arguments[0].click();", test2)
time.sleep(2)
# 包含题目文本的标签
strText = '///div[2]/dl/dd[1]/ul/li/p'
texts = driver.find_elements_by_xpath(strText);
for t in texts:
text = t.text
print(text)
with open('./TK.txt', 'a', encoding='utf-8') as f:
f.write(text + '\n')
time.sleep(3)
return True
# 刷题
def do_homework(driver):
pass
if __name__ == '__main__':
chrome_driver = r'xxx'
os.environ["webdriver.chrome.driver"] = chrome_driver
driver = webdriver.Chrome(chrome_driver)
# 登录网页
url = ''
driver.get(url)
# 用户名,密码
user = ''
password = ''
# 登录
login(driver, user, password)
# 进入课程学习
go_my_course(driver)
# 进行评价和时长
evaluate(driver)
# 爬取题目
#'spider_text(driver)'
# 进行刷题