chapter11-实战成绩通知短信系统(上)

news2025/2/25 10:07:35

恭喜各位同学!当你看到这篇文章的时候,意味着你已经从刚开始的“一无所知”,变成了现在的“爬虫新手”!在之前的文章中,我们从最基础的知识点讲起,一步一步的学习了怎么使用Python爬取我们想要获取的信息,在这期间,我们也穿插着学习了HTML、Linux、Ajax等技术。
从本章开始,我们将开发我们最后的实践程序——成绩短信通知服务。相对应的,各位同学可以在本课程的Github页面上获取到对应的代码。
注意!因为每个院校的教务系统并不是统一的,本门课程只能选择最广泛使用的某方教务系统,因此可能并不能适配你所在的学校。但是,技术是相同的。相信我,跟着我学习完这两章的课程后,你一定会庆幸你学校的教务系统不会是教程中的系统——事实上,某方的反爬虫技术和代码格式让我在开发的过程中苦不堪言,甚至一度想放弃。庆幸的是,通过不懈的努力,这两篇文章终于能够和之前计划的一样,展现在你们的眼前。废话不多说,让我们直接开始!

登录系统

首先我们需要分析登录系统所要传递的参数,如下图所示,我们在的登录的时候,需要输入的参数有:用户名、密码、验证码以及选择学生
在这里插入图片描述

但是,事实的确如此吗?很显然,是错误的!我们在上一章节已经讲过:除了上述我们需要填写的显性内容外,我们还需要传递一个证明自己身份的_VIEWSTATE。那么,什么是_VIEWSTATE呢?

_VIEWSTATE是ASP.NET的一个控件。如果在客户端和服务器段保持往返的状态,在.net中通过加入一个隐藏控件_ViewState来实现的,这些状态的保持不需要程序员来控制,节省了程序员的精力。

那么, _VIEWSTATE参数究竟在哪里能够发现呢?很简单,就在网页的源代码中!
在这里插入图片描述

让我们把它解析出来:

import requests
from bs4 import BeautifulSoup
url = "target_url"
rensponse = requests.get(url)
soup = BeautifulSoup(rensponse.text,'lmxl')
_VIEWSTATE = soup.find('input', attrs={'name': '__VIEWSTATE'})['value']

通过使用上个章节介绍的fiddler4 ,我们可以确定登录系统需要传递以下的参数:

  • _VIEWSTATE:.Net框架用来标记用户身份的控件

  • TextBox1:学号参数

  • TextBox2:密码参数

  • TextBox3:验证码

  • RadioButtonList1:学生标记

  • Button1:空值

  • lbLanguage:空值

    事实上,某方教务系统存在不通过验证码即可登录的界面,我在调试的过程中,也一直在使用该页面。但是为了让开发具有普遍性,因此本门默认使用了带有验证码的登录网页。

正如我在上面提到的那样,因为验证码是需要人工输入的,因此在开发的过程中,我们首先将网页中的验证码图片下载到本机,然后采用人工输入的方式,保证准确性。
注意:后续将提供基于机器学习的验证码识别模型,减少人工输入步骤
so,登录所需要的参数都明白了,让我们直接开发吧!

import requests
from bs4 import BeautifulSoup
username='你的用户名'
password='你的密码'
url = 'targeturl'
HEA = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/'
                     '537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36',
       }

response = requests.get(url,HEA)
if response.status_code=='OK':
    soup = BeautifulSoup(response.text,'lxml')
else:
    hash_url = response.headers['Content-Type']
    url = 'targeturl'
    response = requests.get(url,HEA)
    soup = BeautifulSoup(response.text, 'lxml')
viewState = soup.find('input', attrs={'name': '__VIEWSTATE'})['value']
RadioButtonList1 = u"学生".encode('gb2312','replace')
imgUrl = "targeturl"
imgresponse = s.get(imgUrl, stream=True)
image = imgresponse.content
DstDir = os.getcwd()+"\\"
print("保存验证码到:"+DstDir+"code.jpg"+"\n")
try:
    with open(DstDir+"code.jpg" ,"wb") as jpg:
        jpg.write(image)
except IOError:
    print("IO Error\n")
finally:
    jpg.close
#手动输入验证码
code =input("验证码是:")
data = {
    '__VIEWSTATE':viewState,
    'TextBox1':username,
    'TextBox2':password'

    'RadioButtonList1':RadioButtonList1,
    'Button1':''
}
web_data = requests.post(url=url,data=data,headers=HEA)
print(web_data.text)

运行代码,首先输入我们下载到本地的验证码,然后回车,验证是否登录系统:
在这里插入图片描述

Bingo!我们成功进入到了教务系统中!
####分析成绩页面
让我们分析一下成绩的URL:

在成绩的URL中,我们需要注意以下几个参数:

  • xh:学生用户名

  • xm:学生姓名的URL编码
    其中xm是通过对学生姓名进行URL编码后得到的字符串。你可以在这个网址验证编码前的信息。
    举个例子,有个男生,名字叫“小强”,我们使用URL编码工具对其进行编码,其对应编码后的字符串为%e5%b0%8f%e5%bc%ba
    解释完参数的含义,让我们选取2016-2017年度第二学期的成绩,使用fiddler4 获取服务器的数据传输详情:
    在这里插入图片描述

    同样的,我们还是需要分析一下传输的参数:

  • _VIEWSTATE:.Net框架用来标记用户身份的控件

  • _VIEWSTATEGENERATOR:默认即可

  • ddlXN:选择学年

  • ddlXQ:选择的学期

  • Button1:空置
    其中_VIEWSTATE也是可以从网页中获取到的,ddlXNddlXQ是我们选择的学年和学期。
    因为某方的验证手段,我们必须模拟浏览器header,同时加上Referer参数,Referer参数就是我们所在的成绩页面的URL
    让我们开始写代码:

    chengji_page = 'http://xxxx.xxxx.edu.cn/xscj_gc.aspx?xh=xxxxxxxx&xm=%e5%b0%8f%e5%bc%ba&gnmkdm=N121605'
    header = {
      'Referer':''http://xxxx.xxxx.edu.cn/xscj_gc.aspx?xh=xxxxxxxx&xm=%e5%b0%8f%e5%bc%ba&gnmkdm=N121605',
      'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36'
    }
    response = s.get(chengji_page,headers=header)
    __VIEWSTATE= get_view(response)
    data1 = {
              "__VIEWSTATE":__VIEWSTATE,
              "ddlXN":"2016-2017",
              "ddlXQ":"2",
              "Button1":""
    }
    chengji = s.post(chengji_page,data=data1)
    print(chengji.text)
    

    让我们运行该段代码:
    在这里插入图片描述

    一切显示正常!我们已经获取到了所对应的成绩!接下来,我们需要解析网页,并且将成绩存入数据库中,同时拼接好之前的接口。虽然步骤很多,但是都是我们之前学到的内容,因此,让我们下章将成绩短息通知服务正式完成吧!

总结
  1. 本章完成了成绩短息通知服务的登录获取成绩步骤,这两个步骤是我们开发中最重要的过程,因此同学们有不理解或者不明白的地方,一定要在讨论区发表自己的看法!
  2. 事实上,某方的教务系统代码杂乱无章,或者是有意为之。因此接下来的网页解析,也希望大家能够认真学习;
  3. 在编写课程中,我尝试了使用机器学习去识别验证码,但是准确率只有70%左右,成熟度不够,因此只能使用保守的人工识别验证码的方式保证系统登录正常。在课程的后续过程,甚至是课程结束后,我都会及时更新相关的代码,同时完善验证码的自动识别服务,也希望大家在学习课程后,仍然多多关注本门课程的Github页面,star一下该项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1401398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Angular系列教程之模板语法

文章目录 前言一、模板语法基础二、模板指令三、模板表达式四、模板语法示例五、注意事项五、总结 前言 Angular是一款流行的前端开发框架,它提供了许多功能和工具来简化前端开发过程。其中,模板语法是Angular中一个非常关键的组成部分,它可…

Leveraging Unlabeled Data for Crowd Counting by Learning to Rank

无标签人群技术,作者引入了一种排名。 利用的是一个图的人群数量一定小于等于包含这个图的图 生成排名数据集 作者提出了一种自监督任务,利用的是一个图的人群数量一定小于等于包含这个图的图 流程: 1.以图像中心为中心,划分一…

幻兽帕鲁保姆级搭建服务器,开服教程(LINUX)

一、购买与连接服务器 1.购买服务器 官方文档推荐的服务器要求CPU4核心内存8GB,所以我们要准备好一个4核8GB的服务器。(实测2核4GB的大概在5人左右就特别容易崩溃,CPU占用率在98%,内存占用很快就超过100%溢出,所以想要稳定最低最低…

从零开始的OpenGL光栅化渲染器构建4-延迟渲染及其类似应用

前言 首先介绍一下什么是延迟渲染。延迟渲染是一种先计算场景中的顶点、颜色、法线等信息,将其存入缓冲,再进行光照计算的渲染技术,与直接渲染是相对的概念。为了详细介绍延迟渲染,我们首先需要了解帧缓冲,以及帧缓冲…

C++入门学习(十)如何显示浮点数的完整形态

在C中&#xff0c;如果你想要显示浮点数的完整数字&#xff08;包括小数部分和指数部分&#xff09;&#xff0c;可以使用 std::setprecision 和 std::fixed 来设置精度和固定小数点表示&#xff1a; #include <iostream> #include <iomanip> // 必须包含这个头…

深入剖析:Kafka流数据处理引擎的核心面试问题解析75问(5.7万字参考答案)

Kafka 是一款开源的分布式流处理平台&#xff0c;被广泛应用于构建实时数据管道、日志聚合、事件驱动的架构等场景。本文将深入探究 Kafka 的基本原理、特点以及其在实际应用中的价值和作用。 Kafka 的基本原理是建立在发布-订阅模式之上的。生产者将消息发布到主题&#xff08…

Kafka-消费者-KafkaConsumer分析-Heartbeat

在前面分析Rebalance操作的原理时介绍到&#xff0c;消费者定期向服务端的GroupCoordinator发送HeartbeatRequest来确定彼此在线。 下面就来详细分析KafkaConsumer中Heartbeat的相关实现。 首先了解一下心跳请求和响应的格式。HeartbeatRequest的消息体格式比较简单&#xff…

CTFhub-bak文件

CTFhub-Web-信息泄露-备份文件下载-bak文件 题目信息 解题过程 看到提示说和index.php有关&#xff0c;在url后面加index.php.bak&#xff0c;跳转到http://challenge-7a4da2076cfabae6.sandbox.ctfhub.com:10800/index.php.bak网址&#xff0c;即&#xff1a; 跳转到下载页…

安装ddddocr中遇到的问题

1、需要先安装&#xff1a; pip3 install pyinstaller --no-use-pep517 pip install scikit-build pip install setuptools pip install pyinstaller pip install pillow 重要是的是保证一个python 环境&#xff0c;多个python环境会导致各种问题。并且保证python>3.8…

万辰集团十年经营首度亏损,泡沫式增长是喜是忧?

2023年&#xff0c;线下消费回暖复苏&#xff0c;零售领域更是繁花似锦。以量贩零食为代表的新业态蓬勃发展&#xff0c;引得众多资本和企业纷至沓来。 这一背景下&#xff0c;作为新兴量贩零食的典型代表之一&#xff0c;福建万辰生物科技集团股份有限公司&#xff08;以下简…

JavaEE中的监听器的作用和工作原理

在JavaEE&#xff08;Java Platform, Enterprise Edition&#xff09;中&#xff0c;监听器&#xff08;Listener&#xff09;是一种重要的组件&#xff0c;用于监听和响应Web应用程序中的事件。监听器的作用是在特定的事件发生时执行一些自定义的逻辑。常见的监听器包括Servle…

vue3中Fragment特性的一个bug,需要留意的注意事项

vue3中的Fragment 模版碎片特性是什么&#xff0c;简单的理解就是template模板代码不在像vue2中那样必须在根节点在包裹一层节点了。 vue2写法 <template><div><h1>标题</h1><p>正文内容</p></div> </template>vue3写法 &l…

医学图像的数据增强技术 --- 切割-拼接数据增强(CS-DA)

医学图像的新型数据增强技术 CS-DA 核心思想自然图像和医学图像之间的关键差异CS-DA 步骤确定增强后的数据数量 代码复现 CS-DA 核心思想 论文链接&#xff1a;https://arxiv.org/ftp/arxiv/papers/2210/2210.09099.pdf 大多数用于医学分割的数据增强技术最初是在自然图像上开…

滑动窗口求连续数列最大值(固定窗长和非固定窗长)

非固定窗长 思路&#xff1a; sum 0&#xff0c;max num[0], 依次遍历一个一个往前加&#xff0c;sum sum num[i], 如果sum[i] 小&#xff0c;则替换sum 如果sum > max&#xff0c; 则max sum; int maxSubArray(int* nums, int numsSize){int max nums[0];int sum …

圆的参数方程是如何推导的?

圆的参数方程是如何推导的? 1. 圆的三种参数表示2. 三角函数万能公式3. 回到圆的参数方程1. 圆的三种参数表示 已知圆的第一种参数方程为: x 2 + y 2 = r x^2+y^2=r x2+y2=r   圆的图像如下: 通过上图,不难理解,圆的参数方程还可以用三角函数表示,也就是第二种参数表…

从零开始配置pwn环境:sublime配置并解决pwn脚本报错问题

1.sublime安装 Download - Sublime Text ──(holyeyes㉿kali2023)-[~] └─$ sudo dpkg -i sublime-text_build-4169_amd64.deb [sudo] password for holyeyes: Selecting previously unselected package sublime-text. (Reading database ... 409163 files and directori…

大创项目推荐 深度学习驾驶行为状态检测系统(疲劳 抽烟 喝水 玩手机) - opencv python

文章目录 1 前言1 课题背景2 相关技术2.1 Dlib人脸识别库2.2 疲劳检测算法2.3 YOLOV5算法 3 效果展示3.1 眨眼3.2 打哈欠3.3 使用手机检测3.4 抽烟检测3.5 喝水检测 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的驾…

(超详细)9-YOLOV5改进-添加EffectiveSEModule注意力机制

1、在yolov5/models下面新建一个EffectiveSEModule.py文件&#xff0c;在里面放入下面的代码 代码如下&#xff1a; import torch from torch import nn as nn from timm.models.layers.create_act import create_act_layerclass EffectiveSEModule(nn.Module):def __init__…

使用DALL-E 3模型模拟AI女友的一天 |【人人都是算法专家】

Rocky Ding 公众号&#xff1a;WeThinkIn 知乎&#xff1a;Rocky Ding 写在前面 【人人都是算法专家】栏目专注于分享AI行业中业务/竞赛/研究/产品维度的思考与感悟。欢迎大家一起交流学习&#x1f4aa; 大家好&#xff0c;我是Rocky。 我们都知道DALL-E 3是和Stable Diffusio…

Leetcode的AC指南 —— 栈与队列:232.用栈实现队列

摘要&#xff1a; **Leetcode的AC指南 —— 栈与队列&#xff1a;232.用栈实现队列 **。题目介绍&#xff1a;请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a;…