使用python的requests库简单爬取,使用xpath解析内容

可以获取个人信息、个人照片、成绩单和课表

github地址:https://github.com/PythonerKK/GZCC-Spider


首先使用浏览器开发者调试工具找到登录页面的准确地址:http://jwxw.gzcc.cn/default2.aspx
然后找到验证码的地址:http://jwxw.gzcc.cn/CheckCode.aspx
将验证码保存让用户输入即可
登录时发送POST请求,需要注意要提交一个叫__VIEWSTATE的字段,并且要携带cookies
发送POST后,如果登录成功则返回用户页面,判断即可

__VIEWSTATE=re.compile('name="__VIEWSTATE" value="(.*?)"').findall(data.text)[0]
resource=requests.post(login_url,data=post_data,cookies=cookies,headers=headers).textif '活动报名' in resource:print('登录成功!')dom_tree=etree.HTML(resource)name=dom_tree.xpath('//span[@id="xhxm"]/text()')name=name[0]print('欢迎回来 '+name)return (cookies,name.split('同')[0])else:print('登录失败!')exit(0)

登录成功,输出:xxx同学,你好!

接下来需要获取个人信息、个人照片、成绩单
原理同上,注意携带cookies,成绩页面获取还需要携带__VIEWSTATE字段

效果如下:

全部代码:

# -*- coding: utf-8 -*-
""":author: KK:url: http://github.com/PythonerKK:copyright: © 2018 KK <705555262@qq.com.com>:license: MIT, see LICENSE for more details.
"""
import requests
import re
from lxml import etree
from urllib.request import quote
import csv
def login(username,password):'''登录方正教务系统(广州商学院):param username: 学号:param password: 密码:return: tuple(cookies,name) 返回一个元组'''headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',}login_url = 'http://jwxw.gzcc.cn/default2.aspx'checkcode_url = 'http://jwxw.gzcc.cn/CheckCode.aspx'data=requests.get(login_url)__VIEWSTATE=re.compile('name="__VIEWSTATE" value="(.*?)"').findall(data.text)[0]cookies=data.cookiescheckcode=requests.get(checkcode_url,cookies=cookies,headers=headers)with open('checkcode.jpg','wb') as f:f.write(checkcode.content)code=input('请输入验证码:')while '-' in code:checkcode = requests.get(checkcode_url, cookies=cookies, headers=headers)with open('checkcode.jpg', 'wb') as f:f.write(checkcode.content)code = input('请重新输入验证码:')post_data={'__VIEWSTATE':__VIEWSTATE,'txtUserName':username,'Textbox1':'','TextBox2':password,'txtSecretCode':code,'RadioButtonList1':'%D1%A7%C9%FA','Button1':'','lbLanguage':'','hidPdrs':'','hidsc':'',}resource=requests.post(login_url,data=post_data,cookies=cookies,headers=headers).textif '活动报名' in resource:print('登录成功!')dom_tree=etree.HTML(resource)name=dom_tree.xpath('//span[@id="xhxm"]/text()')name=name[0]print('欢迎回来 '+name)return (cookies,name.split('同')[0])else:print('登录失败!')exit(0)def get_information(cookies,username,name):'''获取个人信息,并导出照片:param cookies: cookies:param username: 学号:param name: 姓名:return: None'''#获取用户个人信息headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36','Referer':'http://jwxw.gzcc.cn/xs_main.aspx?xh='+username}information_url='http://jwxw.gzcc.cn/xsgrxx.aspx?xh='+username+'&xm='+name+'&gnmkdm=N121501'data=requests.get(information_url,cookies=cookies,headers=headers)dom_tree=etree.HTML(data.text)sex=dom_tree.xpath('//span[@id="lbl_xb"]/text()')[0]born=dom_tree.xpath('//span[@id="lbl_csrq"]/text()')[0]id=dom_tree.xpath('//span[@id="lbl_sfzh"]/text()')[0]race=dom_tree.xpath('//span[@id="lbl_mz"]/text()')[0]polity=dom_tree.xpath('//span[@id="lbl_zzmm"]/text()')[0]academic=dom_tree.xpath('//span[@id="lbl_xy"]/text()')[0]xi=dom_tree.xpath('//span[@id="lbl_xi"]/text()')[0]major=dom_tree.xpath('//span[@id="lbl_zymc"]/text()')[0]c=dom_tree.xpath('//span[@id="lbl_pyfx"]/text()')[0]edu=dom_tree.xpath('//span[@id="lbl_CC"]/text()')[0]phone=dom_tree.xpath('//input[@name="TELNUMBER"]/@value')[0]school=dom_tree.xpath('//input[@name="byzx"]/@value')[0]dorm=dom_tree.xpath('//input[@name="ssh"]/@value')[0]email=dom_tree.xpath('//input[@name="dzyxdz"]/@value')[0]loc_code=dom_tree.xpath('//input[@name="yzbm"]/@value')[0]#获取用户照片headers_image={'Accept':'image/webp,image/apng,image/*,*/*;q=0.8','User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36','Referer':'http://jwxw.gzcc.cn/xsgrxx.aspx?xh='+username+'&xm='+quote(name)+'&gnmkdm=N121501',}image_url=re.compile('img id="xszp" src="(.*?)"').findall(data.text)image_url='http://jwxw.gzcc.cn/'+image_url[0]image_url=image_url.replace('amp;','')image_data=requests.get(image_url,headers=headers_image,cookies=cookies)with open('photo.png', 'wb') as f:f.write(image_data.content)print('照片导出成功!')from docx import Documentfrom docx.shared import Inchesdocument = Document()document.styles['Normal'].font.name = u'黑体'document.add_heading(name+'的个人信息',0)pic = document.add_picture('photo.png', width=Inches(1.5))document.add_paragraph('个人资料')document.add_paragraph('姓名:'+name)document.add_paragraph('性别:' + sex)document.add_paragraph('出生:' + born)document.add_paragraph('身份证号:' + id)document.add_paragraph('种族:' + race)document.add_paragraph('政治面貌:' + polity)document.add_paragraph('系部:' + xi)document.add_paragraph('学院:' + academic)document.add_paragraph('专业:' + major)document.add_paragraph('班级:' + c)document.add_paragraph('学历:' + edu)document.add_paragraph('手机号:' + phone)document.add_paragraph('毕业高中:' + school)document.add_paragraph('宿舍号:' + dorm)document.add_paragraph('邮箱号:' + email)document.add_paragraph('邮编:' + loc_code)document.save(username+'个人信息.docx')print('个人资料导出成功!')def get_curriculum(cookies,username,name):'''获取学生当前课表:param cookies:cookies:param username: 学号:param name: 姓名:return: None'''headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36','Referer':'http://jwxw.gzcc.cn/xs_main.aspx?xh='+username}curriculum_url='http://jwxw.gzcc.cn/xskbcx.aspx?xh='+username+'&xm='+password+'&gnmkdm=N121603'data=requests.get(curriculum_url,cookies=cookies,headers=headers)# import lxml# dom_tree=etree.HTML(data.text)# curriculum=dom_tree.xpath('//table[@id="Table1"]')print(data.text)
def get_score(cookies,username,name):'''获取所有考试成绩,并导出csv:param cookies: cookies:param username: 学号:param name: 姓名:return: Boolean'''headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36','Referer':'http://jwxw.gzcc.cn/xs_main.aspx?xh='+username}first_url='http://jwxw.gzcc.cn/xscjcx.aspx?xh='+username+'&xm='+name+'&gnmkdm=N121605'data=requests.get(first_url,cookies=cookies,headers=headers)viewstate=re.compile('name="__VIEWSTATE" value="(.*?)"').findall(data.text)viewstate=viewstate[0]headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36','Referer':'http://jwxw.gzcc.cn/xscjcx.aspx?xh='+username+'&xm='+quote(name)+'&gnmkdm=N121605'}print(headers)score_url='http://jwxw.gzcc.cn/xscjcx.aspx?xh='+username+'&xm='+name+'&gnmkdm=N121605'post_data={'__EVENTTARGET':'','__EVENTARGUMENT':'','__VIEWSTATE':viewstate,'hidLanguage':'','ddlXN':'','ddlXQ':'','ddl_kcxz':'','btn_zcj':'%C0%FA%C4%EA%B3%C9%BC%A8'}scores=requests.post(score_url,cookies=cookies,headers=headers,data=post_data)all=re.compile('<td>(.*?)</td><td>(\d+)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td>(.*?)</td><td></td><td></td>').findall(scores.text)for i in all:with open('score.csv', 'a', newline='') as f:try:csv_out=csv.writer(f,dialect='excel')csv_out.writerow([i[0],i[1],i[2],i[3],i[4],i[5].replace('&nbsp;',''),i[6],i[7],i[8],i[9].replace('&nbsp;',''),i[10].replace('&nbsp;',''),i[11].replace('&nbsp;',''),i[12].replace('&nbsp;','')])except Exception:print('导出失败!')return Falseprint('成绩导出成功!')return Truedef change_password(cookies,username,password,password1,password2):'''修改密码:param cookies: cookies:param username: 学号:param password: 原密码:param password1: 新密码:param password2: 再次输入新密码:return: None'''url='http://jwxw.gzcc.cn/mmxg.aspx?xh='+username+'&gnmkdm=N121502'headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36','Referer':'http://jwxw.gzcc.cn/xs_main.aspx?xh='+username}data=requests.get(url,headers=headers,cookies=cookies)viewstate=re.compile('name="__VIEWSTATE" value="(.*?)"').findall(data.text)viewstate=viewstate[0]postdata={'Button1':'%D0%DE++%B8%C4','__VIEWSTATE':viewstate,'TextBox2':password,'TextBox3':password1,'Textbox4':password2,}data=requests.post(url,data=postdata,cookies=cookies,headers=headers)print('密码修改成功!')
if __name__ == '__main__':print('广州商学院正方教务系统登录')username=input('请输入学号:')password=input('请输入密码:')cookies,name=login(username,password)#get_information(cookies,username,name)#get_curriculum(cookies,username,name)#get_score(cookies,username,name)#change_password(cookies,username,password,password1=password,password2=password)

转载于:https://www.cnblogs.com/PyKK2019/p/gzcc-spider.html

广州商学院Python正方教务系统爬虫(获取个人信息成绩课表修改密码)相关推荐

  1. python实现高校教务管理系统_Python实现新版正方教务系统爬虫

    目录~ 引入 需要什么软件? 模拟登陆 代码实现(登陆) 模拟获取成绩 代码实现(获取成绩) 解析成绩 测试(完成图) 作者的话 引入 就在我刚刚写完旧版正方系统爬虫的时候(旧版正方系统爬虫代码) 学 ...

  2. Python实现新版正方教务系统爬虫(二)

    前言 哎对不起 我可能是silly boy 我想在学校里把去年的坑填了 但是发现新版的教务系统代码没传到git上 我现在就成了个对着空ide发呆的憨憨(代码在家里啦 所以填坑就再过会吧 那就稍微闲聊一 ...

  3. 正方教务系统爬虫实现

    主要库 requests,json,re 分析网页 第一眼就看到网页后缀是.aspx,也就是用的ASP.NET技术,不算老熟人有兴趣可以了解下https://baike.baidu.com/item/ ...

  4. go语言爬取新版正方教务系统数据

    go语言爬取新版正方教务系统数据 学完go语言的基础之后已经过了一个多月了,开始想试着利用些时间写写博客,就打算将半个月前练着写的一个go爬虫小项目翻出来写写.由于之前对go爬虫的一些基础知识不熟悉, ...

  5. 正方教务系统成绩爬虫的实现

    正方教务系统爬虫 简介 一.设计思路以及工具 二.实现步骤 1.登陆流程 1.1抓取登陆链接 1.2 验证码获取 1.3 发送登陆请求 2.读入数据 2.1 获取历年成绩对应的__VIEWSTATE ...

  6. 我的第一个开源项目:Java爬虫爬取旧版正方教务系统课程表、成绩表

    Java爬虫爬取旧版正方教务系统课程表.成绩表 一.项目展示 1.正方教务系统 首页 2.爬虫系统 首页: 成绩查询: 课表查询: 二.项目实现 1.爬取思路描述 无论是成绩查询或课表查询亦或者其它的 ...

  7. php模拟登陆青果教务系统,模拟登录 - php CURL模拟登陆正方教务系统

    代码如下 $cookie_file = tempnam('./temp','cookie'); $login_url = 'http://211.64.47.129/default_ysdx.aspx ...

  8. 模拟登录爬取广职院正方教务系统

    最近突然的想爬取学校的课程表,于是经过几经努力,终于出来的一个小demo,话不多说,马上为大家讲解:先放上代码 import re import requests from fake_useragen ...

  9. python爬虫学校正方教务系统获取全部成绩

    python爬虫正方教务系统许昌学院 来自许昌学院的大四小菜鸡,疫情封在宿舍,闲来无事在宿舍爬了一下之前没成功的教务系统爬虫,当时觉得挺难的,今天发现这个还是挺简单的,这个程序参考了很多前辈大佬们的程 ...

最新文章

  1. Unity 总裁 John Riccitiello 发话:VR足以匹敌互联网
  2. [翻译]Json.NET API-Linq to Json Basic Operator(基本操作)
  3. .NET 5 程序高级调试-WinDbg
  4. datagrid 什么时候结束编辑_孕吐到底什么时候结束
  5. ResNet 运行在Cifar10 测试集86.38% Tensorflow 2.1 小白从代码实践中 理解
  6. python with as有什么好处?
  7. Linux防火墙iptables学习笔记(四)iptables实现NAT
  8. 两万字的CAPL语法基础,一篇文章带你入门
  9. 电子表格计算机操作题及素材,2015计算机应用基础-excel电子表格题目.doc
  10. 金盘系统无法连接服务器,西数金盘Gold系列主要面向企业级服务器及存储系统...
  11. 恶搞视频聊天偷拍源码
  12. Navicat绘制数据库物理模型
  13. 自识别标记(self-identifying marker) -(2) 用于相机标定的CALTag介绍
  14. 晶振及其内部电路详解
  15. 1166 - Unknown error 1166[mysql 错误
  16. 【机器学习基石】机器学习的种类(三)
  17. RSA非对称加密算法
  18. jenkins+gitee 实现自动化部署项目到centos上
  19. PowerPC简介及编程
  20. 某Keylogger分析

热门文章

  1. 小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码)
  2. 同事乱用 Redis 卡爆,我真是醉了...
  3. 每一个开发人员都应该懂的 UML 规范
  4. 说实话,DataGrip真得牛逼,只是你不会用而已~
  5. 面进了心心念念的国企!以为TM上岸了!干了1年!我却再次选择回到互联网大厂内卷!
  6. 面试官问:Redis变慢了,你会怎么排查?
  7. 为什么阿里巴巴要求日期格式化时必须有使用y表示年,而不能用Y?
  8. 终于放弃了单调的 Swagger 了,选择了这款神器 Knife4j
  9. 代码神器:拒绝重复编码,这款IDEA插件了解一下.....
  10. ShutdownHook - java中优雅地停止服务