from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import pprint
import time
from selenium.common.exceptions import NoSuchElementException
from lxml import etree
from PIL import Image,ImageEnhance
import pytesseract
def request_url(url):
# 打开浏览器
browser_add = r'D:\软件安装地址\360Chrome\Chrome\Application\360chrome.exe'
chrome_options = Options()
chrome_options.binary_location = browser_add
browser = webdriver.Chrome(chrome_options=chrome_options)
# 打开网址
browser.get(url)
# 输入信息:
number = input("请输入账号:")
input_name = browser.find_element_by_id("userAccount") # userAccount:来自元素审查
input_name.send_keys(number)
passwd = input("请输入密码:")
input_pass = browser.find_element_by_id("userPassword")
input_pass.send_keys(passwd)
#验证码识别
screenImg = "D:/screenImg.png"
# 获取验证码图片url,并将截图保存本地
browser.find_element_by_id("SafeCodeImg").get_attribute('src')
browser.get_screenshot_as_file(screenImg)
# 定位验证码位置及大小
location = browser.find_element_by_id('SafeCodeImg').location
size = browser.find_element_by_id('SafeCodeImg').size
left = location['x'] + 4
top = location['y']
right = location['x'] + size['width'] - 115
bottom = location['y'] + size['height']
# 从本地读取截图,截取验证码位置并处理
img = Image.open(screenImg).crop((left, top, right, bottom))
img = img.convert('L') # 转换模式:L | RGB
threshold = 127
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
img = img.point(table, '1')
# 保存处理后的图片
img.save(screenImg)
# 再次读取识别验证码
img = Image.open(screenImg)
code = pytesseract.image_to_string(img)
print(code.strip())
# 填入验证码
input_image = browser.find_element_by_id("RANDOMCODE")
input_image.send_keys(code.strip())
time.sleep(1)
# 点击登入
button = browser.find_element_by_id("btnSubmit")
button.click()
# 打开页面至课程表所在的子页面
button = browser.find_element_by_id("btnSubmit")
button.click()
# 打开一级子页面
browser.switch_to.frame("frmIframe") #来着上级页面的源代码Ctrl+F
time.sleep(5) #程序休停为了页面加载
classes = browser.find_element_by_class_name("block9")
classes.click()
# 打开二级页面
browser.switch_to.frame("notSession")
time.sleep(5)
try:
browser.find_element_by_xpath("//div[@class='Nsb_layout_l Nsb_l_list']/ul[2]/li/a")
except NoSuchElementException:
print("a")
browser.switch_to.parent_frame() #返回上级页面
classes1 = browser.find_element_by_xpath("//div[@class='Nsb_layout_l Nsb_l_list']/ul[2]/li/a")
classes1.click()
# 获取当前页面源代码
ret = browser.page_source
return ret
def show(ret):
html = etree.HTML(ret, parser=etree.HTMLParser(encoding='utf-8')) # etree获取网页源代码,非本地文档
a = html.xpath('//div[@class="kbcontent1"]/text()')
for i in range(30):
try:
a.remove('\xa0')
a.remove('----------------------')
except ValueError:
continue
b = set(a) #建立集合剔除重复元素
pprint.pprint(b)
print("总共"+str(len(b))+"门课程") #数字直接加字符串会报错
if __name__ == '__main__':
url = "http://jwxt.qlu.edu.cn/"
ret=request_url(url)
show(ret)
结果展示:
课程表信息可以完全获取,因数据整理较麻烦,不再处理
D:\Pycharm-project\venv\Scripts\python.exe D:/Python编程/爬虫/登入.py
请输入账号:2017XXXXXX
请输入密码:XXXXXXXXXX
请输入验证码:bbn3
a
{'Matlab及电力系统仿真',
'个人理财(智慧树)',
'信号与系统II',
'复变函数与积分变换',
'大学体育(4)',
'形势与政策2',
'抹茶蛋糕制作工艺研究',
'数字电子技术',
'毛泽东思想和中国特色社会主义理论体系概论',
'电机学',
'简明电磁场',
'费斯托木工机械的学习与应用'}
总共12门课程
Process finished with exit code 0