平时爬取网页,以及模拟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文件,是否模拟登录成功:
显然,已经登录成功! 下面就可以进一步抓包,完成更多操作了,不用多说,大家应该懂的,嘿嘿!
更多优质内容,请关注公众号:生物信息与python