爬虫实战(1) 您所在的位置:网站首页 学校官网成绩怎么下载 爬虫实战(1)

爬虫实战(1)

2024-07-11 01:24| 来源: 网络整理| 查看: 265

爬虫实战(1)--爬取正方系统 前言使用工具以及第三方库登陆页面模拟获取登录时的post参数验证码处理 成绩爬取分析

前言

前段时间参加软件杯比赛,第一次真正意义上接触python,想着暑假无事系统学习下python的有关知识。本着实践为主的我,想一边学习爬虫,一边学习知识,这样印象会更加深刻,于是学校官网成为我的目标,(每年查成绩,那叫一个痛苦,学校的土豆服务器)话不多数,介绍下实现的过程

使用工具以及第三方库

使用语言:python3.6 开发工具:PyChram 第三方库:

requests (强大的爬虫库)BeautifulSoup (用于处理爬取的网页信息)PIL (图象处理,本项目用于显示验证码图片)下载方法 pip install *** 登陆页面模拟

首先,打开登陆首页,如果你的学校用的也是正方系统的话,界面如下 在这里插入图片描述

获取登录时的post参数

为了看清楚请求登陆时请求的页面以及请求的的参数,我们点击F12,查看调试页面

选择network ,然后在页面上尝试登陆一次,可以发现

登陆请求的页面是 default2.aspx

我们点击它,查看他的 form data 也就是发送的请求参数,发现如下:

__VIEWSTATE: TextBox1: (我们学校为学号) TextBox2: (我们学校为密码) TextBox3: 8cx7(测试发现为固定值) RadioButtonList1: %D1%A7%C9%FA(测试发现为固定值) Button1: (值为空,但是发送请求的时候需要发送)

我们发现,对default2.aspx进行post请求的同时,发送了上面几个参数,其中只有 __VIEWSTATE 的值不确定,所以我们进一步分析发现,在登陆页面有这样一个h5语句:

所以初步判定,__VIEWSTATE的值只需要获取登陆页面值就够了,至此,代码如下:

import requests from bs4 import BeautifulSoup # 学校官网地址 url = '' # 创建requests s = requests.session() # 获取登录界面 login_page = s.get(url+'default2.aspx') # 获取value值 soup = BeautifulSoup(login_page.text, 'lxml') __VIEWSTATE = soup.find('input', attrs={'name': '__VIEWSTATE'}).get('value')

以上代码是在登陆页面上,抓取页面的html,然后通过bs4获取input的value的值,也就是参数中的 __VIEWSTATE

验证码处理

之前百度过,正方系统在以前是可以绕过验证码的,但是现在似乎被封了。不过遇到问题应该先尝试着是解决他不去绕过他,这里的验证码提供两个思路:

第一个:获取页面cookies,爬取验证码图片,下载到本地,通过显示他让用户输入来验证 第二个:通过机器学习,这里的验证码的背景比较干净,训练起来应该难度不大,推荐crnn

本次我们采用的是第一个办法,代码如下:

import requests from bs4 import BeautifulSoup # 学校官网地址 url = '' # 创建requests s = requests.session() # 获取登录界面 login_page = s.get(url+'default2.aspx') # 获取cookie cookies = login_page.cookies # 获取验证码 pic = s.get(url+'CheckCode.aspx', cookies=cookies).content with open('ver_pic.png', 'wb') as f: f.write(pic) # 读取验证码显示出来 image = Image.open("ver_pic.png") image.show() # 显示 checkcode = input("请输入验证码:")

这里注意,获取的验证码验证错误大概率是cookies没处理好,多检查下。

至此,我们处理好了登陆,以下为登陆过程的完整代码:

import requests from bs4 import BeautifulSoup from PIL import Image # 学校官网地址 url = '' # 创建requests s = requests.session() # 获取登录界面 login_page = s.get(url+'default2.aspx') # 获取cookie cookies = login_page.cookies soup = BeautifulSoup(login_page.text, 'lxml') __VIEWSTATE = soup.find('input', attrs={'name': '__VIEWSTATE'}).get('value') # 获取验证码 pic = s.get(url+'CheckCode.aspx', cookies=cookies).content with open('ver_pic.png', 'wb') as f: f.write(pic) # 读取验证码显示出来 image = Image.open("ver_pic.png") image.show() # 显示 checkcode = input("请输入验证码:") your_id = input("请输入学号:") your_password = input("请输入密码:") # 向登陆页面发送请求 data = {'__VIEWSTATE': __VIEWSTATE, 'TextBox1': your_id, 'TextBox2': your_password, 'TextBox3': checkcode, 'RadioButtonList1': r'%D1%A7%C9%FA', 'Button1': ''} r = s.post(url+'default2.aspx', data, cookies) 成绩爬取分析

这部分的思路与登陆部分相同,并且没有验证码相对比较简单,就简单的贴下代码,提一下注意的几点内容:

第一:如果爬取内容提示 Object moved to here 需要加请求头,告诉服务器你是从哪个网址过来的. 第二:__VIEWSTATE 的值其实可以直接写固定,经过尝试,固定写死是可以通过的.

代码如下:

# 设置响应头 mark_head = { 'Referer': url+'xs_main.aspx?xh='+your_id } # 设置发送值 find_data = { '__VIEWSTATE': '', 'ddlXN': '', 'ddlXQ': '', 'Button2': '%D4%DA%D0%A3%D1%A7%CF%B0%B3%C9%BC%A8%B2%E9%D1%AF' } my_cj = s.post(url+'xscj_gc.aspx?xh='+your_id+'&xm='+your_name+'&gnmkdm=N121605', find_data, headers=mark_head) # 规范化输出 soup3 = BeautifulSoup(my_cj.text, 'lxml') marktable = str(soup3.find_all(id="Datagrid1")) soup2 = BeautifulSoup(marktable, 'lxml') lines = soup2.find_all('tr') my_chengji = {} for tr in lines: chengji = [] soup1 = BeautifulSoup(str(tr), 'lxml').get_text('\t') print(soup1)

以上就是全部代码,有什么地方不懂的可以提问我哦,相对来说,这个网站的爬取还是蛮简单的。

最后祝大家敲码愉快~



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有