写这个爬虫的缘由

以前用java写过一个爬取学校的教务系统的爬虫 https://blog.csdn.net/ygdxt/article/details/81158321,最近痴迷Python爬虫,了解到许多强大的库,想再一次用学校的教务系统做下测试。

这一次我首先想到的是新的教务系统,这个难度更大,因为有了验证码识别反爬,由于我是用的tessocr库识别验证码,(具体配置过程可以参考我之前的博客python填坑之路:tesserocr配置)

用Requests.get方法把验证码下载下来识别之后,同时因为我爬取网页是用的selenium做的模拟网页动作,这里就有一个同步性的问题,不能保证selenium请求网页上的验证码和requests请求的验证码是同一个,相当于selenium、requests分别请求了一次登陆网页,两个网页上的验证码显然是不同的。所以怎么保证请求登录界面得到的网页上的验证码

和我们请求验证码服务器返回的验证码是同一个验证码是同一个是一个很迷人的问题,

我开始还以为可以从网页源代码上直接定位到这个验证码,结果显示这个验证码在登录界面的

的存在形式不是一个..png/jpg,而是通过src=“验证码服务器”来实现异步加载

同时,由于tessocr识别验证码的成功率可能只有50%,要提高验证率可能还要对接云打码,果断放弃了爬取新教务系统的想法,还是爬取原来的没有验证码的旧教务系统,

其实新旧教务系统最大的区别就是登陆界面不一样,登陆之后都一样,貌似用了重定向

ps:如果你对这个问题有什么好的解决办法,请不吝赐教

运行结果预览

20181128201749396.png

编码过程

详细的代码解释就看注释吧,有什么问题欢迎交流

执行爬虫的主程序csu.py,里面有许多测试用的注释代码,就不删了from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.common.exceptions import TimeoutExceptionfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.select import Selectfrom config import *import time

broswer = webdriver.Chrome()

wait = WebDriverWait(broswer, 10)def search():

try:

broswer.get("http://csujwc.its.csu.edu.cn/jsxsd/kscj/yscjcx_list")

account = wait.until(

EC.presence_of_element_located((By.CSS_SELECTOR, "#userAccount"))

)

password = wait.until(

EC.presence_of_element_located((By.CSS_SELECTOR, "#userPassword"))

)

submit = wait.until(

EC.element_to_be_clickable((By.CSS_SELECTOR, "#btnSubmit"))

)    except TimeoutException:        return search()    #登录

account.send_keys(ACCOUNT)

password.send_keys(PASSWORD)

submit.click()   #进入我的成绩界面

my_score = wait.until(

EC.presence_of_element_located((By.CSS_SELECTOR,"body > div.wap > a:nth-child(3) > div"))

)

my_score.click()#成绩和平均分

# my_rank = wait.until(

#     EC.presence_of_element_located((By.CSS_SELECTOR, "#LeftMenu1_divChildMenu > ul > li:nth-child(4) > a"))

# )

# my_rank.click()

#

# rank = wait.until(

#     EC.presence_of_element_located((By.CSS_SELECTOR, "#dataList > tbody > tr:nth-child(2) > td:nth-child(3)"))

# )

# #http://www.w3school.com.cn/cssref/selector_nth-child.asp nth-child(n)的用法

# average_score = wait.until(

#     EC.presence_of_element_located((By.CSS_SELECTOR, "#dataList > tbody > tr:nth-child(2) > td:nth-child(4)"))

# )

#

# print('您的平均成绩是:'+average_score.text+"\n排名:"+rank.text)#逐次展示 我的成绩八个子项

# css_selector = "#LeftMenu1_divChildMenu > ul > li:nth-child({0}) > a"

# for i in range(8):

#     # 将滚动条移动到页面的顶部

#     js = "var q=document.documentElement.scrollTop=0"

#     broswer.execute_script(js)

#     time.sleep(2)

#

#     aviable_score = wait.until(

#         EC.presence_of_element_located((By.CSS_SELECTOR, css_selector.format(str(i+1))))

#     )

#     aviable_score.click()

#

#

#     #将滚动条移动到页面的底部

#     for j in range(8):

#         js="var q=document.documentElement.scrollTop="+str(j*200)

#         broswer.execute_script(js)

#         time.sleep(1)

#处理select https://www.cnblogs.com/imyalost/p/7846653.html

yxcj = wait.until(

EC.element_to_be_clickable((By.CSS_SELECTOR, "#LeftMenu1_divChildMenu > ul > li:nth-child(1) > a"))

)

select_score_element = broswer.find_element_by_css_selector("#xnxq01id")

select_score = Select(select_score_element)    #得到下拉列表的所有子项

select_score_items = broswer.find_elements_by_css_selector("#xnxq01id option")

select_score_items_text = []    for item in select_score_items:

select_score_items_text.append(item.text)        #print(item.text)

scores_dic = {}    for i in range(len(select_score.options)):        #不加这两行会报错,原因: https://blog.csdn.net/ulebo/article/details/52128033

print("*****************************************************"+select_score_items_text[i]+              "*****************************************************")

select_score_element = broswer.find_element_by_css_selector("#xnxq01id")

select_score = Select(select_score_element)

select_score.select_by_index(i)

time.sleep(1)

score_table = broswer.find_element_by_css_selector("#dataList")

data = score_table.text.replace("+","")

data = data.split("\n")

datalist = []        for line in data:

datalist.append(line.split())

scores_dic[select_score_items_text[i]] = datalist    return scores_dic[select_score_items_text[0]]def main():

search()if __name__ =="__main__":

main()

ui.py程序的gui,直接运行这个就好,它会调用csu.py#coding=utf-8import wximport wx.gridimport csuclass UI(wx.Frame):

def __init__(self):

wx.Frame.__init__(self,parent=None,title="成绩查询",size=(1050,560))

grid = wx.grid.Grid(self,pos=(10,0),size=(1050,500))

grid.CreateGrid(100,9)        for i in range(100):            for j in range(9):

grid.SetCellAlignment(i,j,wx.ALIGN_CENTER,wx.ALIGN_CENTER)

grid.SetColLabelValue(0, "序号") #第一列标签

grid.SetColLabelValue(1, "初修学期")

grid.SetColLabelValue(2, "获得学期")

grid.SetColLabelValue(3, "课程")

grid.SetColLabelValue(4, "成绩")  # 第一列标签

grid.SetColLabelValue(5, "学分")

grid.SetColLabelValue(6, "课程属性")

grid.SetColLabelValue(7, "课程性质")

grid.SetColLabelValue(8, "获得方式")  # 第一列标签

grid.SetColSize(0,50)

grid.SetColSize(1,100)

grid.SetColSize(2,100)

grid.SetColSize(3,350)

grid.SetColSize(4,50)

grid.SetColSize(5,50)

grid.SetColSize(6,50)

grid.SetColSize(7,100)

grid.SetColSize(8,100)

grid.SetCellTextColour("NAVY")

data = csu.search()

data.remove(data[0])

print(data)        for i,item1 in enumerate(data):            for j,item2 in enumerate(item1):

grid.SetCellValue(i,j,data[i][j])        passapp = wx.App()

frame = UI()

frame.Show()

app.MainLoop()

作者:inspurer

链接:https://www.jianshu.com/p/967245e5f9b1

python学校_python爬取学校教务系统相关推荐

  1. python爬去学校_python爬取学校教务系统

    写这个爬虫的缘由 以前用java写过一个爬取学校的教务系统的爬虫 https://blog.csdn.net/ygdxt/article/details/81158321,最近痴迷Python爬虫,了 ...

  2. Python爬取URP教务系统课程表并保存到excel

    Python爬取URP教务系统课程表并保存到excel 爬取URP教务系统课程表最终结果如图所示: 接下来开始操作: 首先打开教务系统->按F12->点击Network->刷新一下界 ...

  3. 爬取正方教务系统完成成绩查询

    刚刚开始接触爬虫,在爬过起点中文网这种不要登陆的网页后转向教务系统这种需要登陆的网页,登录这个因为还有验证码,刚接触所以花费了很长时间,说到底其实就是把你的信息交给网站让它可以认得你的过程,而登录过后 ...

  4. 爬取正方教务系统课程表

    被一个学长布置下的任务-有些地方可能不够完整- 思路: 首先你需要完成登录操作: (1) 首先根据教务系统网站的审查元素, 发现了一个验证码的网址:http://210.40.2.253:8888/( ...

  5. python段子_python 爬取 段子网 实例

    今天开始了对之前操作的代码的更改跟改错. 上期的内容中间的日期,热度,点赞数量没有爬取出来,今天做了以下修改,成功的爬取到了我们想要的内容. 改错的内容:第二行出现空值问题,显示不出来     下面是 ...

  6. python作品_Python爬取图虫网摄影作品

    准备 要爬的网站是图虫网 工具:python 2.7,BeautifulSoup4 注意:BeautifulSoup4为第三方类库,如果在cmd下用pip安装报错,可直接去官网下载,解压后拷贝到pyt ...

  7. java工程师学python爬虫_Python 爬取 11 万 Java 程序员信息竟有这些重大发现!

    原标题:Python 爬取 11 万 Java 程序员信息竟有这些重大发现! 一提到程序猿,我们的脑子里就会出现这样的画面: 或者这样的画面: 心头萦绕的字眼是:秃头.猝死.眼镜.黑白 T 恤.钢铁直 ...

  8. python 报价_python爬取京东价格

    昨天准备爬取一个京东商品的价格,正则写好了一直是空的 后来我去页面里面看了下,价格标签里果然是空的 百度了下,大家都说是js来控制显示价格的 于是去抓包试试,找到了一条mgets的请求 中间很多参数不 ...

  9. java计算课程学分绩点_【Java爬虫】爬取南通大学教务系统成绩计算绩点

    以前写过一个python版的,但是想做一个jsp网页版的,就又用Java有写了一下. 具体地址的分析过程在这里,这里简单说一下HttpCliet的Get,Post方法的使用 1.Get请求方法 //创 ...

最新文章

  1. torch动态学习率代码
  2. MSM8974 fastboot烧写软件
  3. ASP.NET Core - 关于标签帮助器值得了解的五点
  4. 用虚拟网卡(softether)共享局域网资源
  5. java经典面试题目
  6. 基于SkyEye的MPC5554 片上Flash实现
  7. 矩池云上如何安装tensorRT
  8. pygame.error: video system not initialized的解决办法
  9. servlet异步请求
  10. 另存为映射技术,异速联让导出导入更简单
  11. 聚类算法的原理是什么?
  12. 线性方程组的几种解法以及解的性质和结构
  13. 基于OpenCV-python3实现证件照换背景
  14. mysql删除某天前的数据
  15. win11/ win10 C盘扩容教程
  16. 浏览器收藏夹整理及无效链接批量删除
  17. 注释(单行注释、多行注释、文档注释)
  18. Acwing - 算法基础课 - 笔记(图论 · 三)
  19. ios 三种随机数方法
  20. 介绍一款很好用,超级棒的去中心化雷达 app

热门文章

  1. 新福华无纺布周利民之十二生肖(羊)
  2. 字体族、图标字体简介、图标字体的其他使用方式、IconFont、行高、字体的简写属性、文本的水平和垂直对齐、其他的文本样式——06fontbackground
  3. 衣物洗涤领域,RFID技术前景广阔
  4. w ndows移动中心从哪里找,win7系统电脑windows移动中心打不开的解决方法【图文】...
  5. 项目进度管理:掌握合适的方法和工具
  6. 图同构算法(weisfeiler-Lehman)
  7. java 获取日历连续签到的天数
  8. Spring底层核心原理
  9. 1,安装 onlyoffice
  10. 什么才算是高质量的代码?