python:模拟浏览器输入验证码,登陆网页(抓包分析和网页爬取,以及http协议的一点理解)

平时爬取网页,以及模拟12306抢票中,最重要的一点就是模拟浏览器输入验证码,登陆网页。

只有打开验证码这一关,才能进行下一步操作。 下面,我们先来讲一讲简单地模拟登陆,这次模拟登录的网站是英语课本随行课堂《视听说教程3》上的听力训练网址:外教社课程中心

工具如下:

IDE:pycharm python3.6

OS:window10

抓包分析

首先我们看一下 url get到的网页:

看见上面的登录按钮了吗? 这也就是登录的窗口,我们点击一下:

F12加F5刷新可以得到,我们点击之后,访问的真正的url,请求方式是get请求。

当我随便输入一个账号和密码,以及验证码时,浏览器会提交给服务器一个post请求,而我们输入的数据存储在表单之中,利用F12可以容易分析到:

我进行一个post请求,访问的真正的url是我画红线的部分,而我提交的数据呢? 我们继续往下面找:

看我所标志的区域,分别是我刚刚输入的账号,密码,以及一些验证信息。 这里的账号和密码均为明文,并未加密,所以很容易分析:我刚刚输入的账号和密码分别是:sghen/123456(这里的抓包分析之后,如果大家仔细想想,通过wifi是不是就可以很容易获取别人的账号和密码了呢。)

bs4爬取网页分析

而其中的“lt”是一个随机的网页验证码,后面的内容,通过之前的爬虫学习,我们应该很容易的得到:

如图,我所指的标签中,“value”属性所对应的值便是这个网页验证码,所以,代码如下:

url="https://sso.sflep.com/cas/login?service=https%3A%2F%2Fsso.sflep.com%2F"
header={"Referer":"https://sso.sflep.com/cas/login?service=https%3A%2F%2Fsso.sflep.com%2F",
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
        }
my_session=requests.session()
res1=my_session.get(url,headers=header)
print(res1.status_code)
soup=BeautifulSoup(res1.text,'lxml')
Tag=soup.find('input',attrs={"name":"lt"})["value"]
#到这里,我们就能得到,需要从网页中获得的信息了,下面就要模拟登录操作

http协议的一点理解:

在这里说一下session模块。session()的作用是建立一个会话,它能够自动的保存cookie值,在这里补充一点http协议的知识:http(或者https)请求网页是无状态的,也就是不会建立联系。比如,我用电脑访问了这个网页,然后第二次又同样的进行访问,服务器那边是不知道两次访问的人是不是都是我这台客户机的。 如果要建立联系,那么就需要cookie。 当客户机发出一个http请求的时候,服务器如果接收到了请求,那么它会返回一个set-cookie给客户机。同时,客户机将会把这个数据保存到自己请求头中,对应的键叫做:”cookie“。儿之和键对应的值就是cookie值,如果你进行下一次访问的时候,在请求头里面加上了这个cooike值,那么服务器一段将能够判断出你是上一次访问的客户机,所以就能够进行下一步的访问。

说到这里,我们就可以编写代码了:

datas={"username":"你的账号",
       "password":"你的密码",
       "lt":Tag,
       "_eventId":"submit",
       "submit":"登录"
}#构建一个data字典,也就是待会儿将要发送的post请求中发送的数据
res2=my_session.post(url,data=datas,headers=header)
res2.encoding=res2.apparent_encoding
text=res2.content
print(res2.headers)
print(res2.status_code)
with  open(r"C:\Users\13016\Desktop\1.html",'w',encoding='utf-8')   as   f:
    f.write(res2.text)#将获取的信息,保存为html文件,查看是否登录成功

值得注意的是:res2.encoding=res2.apparent_encoding这句十分的重要,因为大量网页为了使用户访问时的速度更快,一般都会对网页进行压缩传输,通常使用的压缩方式是:gzip

如果不对response进行转码的话,输出的内容很可能是乱码,所以这一句是很有必要的。

完整代码:

import  requests
from  bs4  import  BeautifulSoup
url="https://sso.sflep.com/cas/login?service=https%3A%2F%2Fsso.sflep.com%2F"
header={"Referer":"https://sso.sflep.com/cas/login?service=https%3A%2F%2Fsso.sflep.com%2F",
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"
        }
my_session=requests.session()
res1=my_session.get(url,headers=header)
print(res1.status_code)
soup=BeautifulSoup(res1.text,'lxml')
Tag=soup.find('input',attrs={"name":"lt"})["value"]
datas={"username":"17607100663",
       "password":"zz1301646236",
       "lt":Tag,
       "_eventId":"submit",
       "submit":"登录"
}
res2=my_session.post(url,data=datas,headers=header)
res2.encoding=res2.apparent_encoding
text=res2.content
print(res2.headers)
print(res2.status_code)
with  open(r"C:\Users\13016\Desktop\1.html",'w',encoding='utf-8')   as   f:
    f.write(res2.text)
我们来查看一下刚刚保存的html文件,是否模拟登录成功:

显然,已经登录成功! 下面就可以进一步抓包,完成更多操作了,不用多说,大家应该懂的,嘿嘿!

全文结束,欢迎在评论区讨论~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券