爬虫实战(1)--爬取学校官网获取成绩

前言

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

使用工具以及第三方库

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

  1. requests (强大的爬虫库)
  2. BeautifulSoup (用于处理爬取的网页信息)
  3. PIL (图象处理,本项目用于显示验证码图片)
  4. 下载方法
    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语句:

<input type="hidden" name="__VIEWSTATE" value="dDw3OTkxMjIwNTU7Oz5vJ/yYUi9dD4fEnRUKesDFl8hEKA==" />

所以初步判定,__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)

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

最后祝大家敲码愉快~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值