前言
在爬取很多需要先登陆的网站的时候,第一步是需要模拟浏览器登陆过程,向目标网页(url) post一个含有账户密码以及额外信息的表单,成功登陆操作后,就获取到目标网页的内容。
分析登陆过程
这里以我本科学校的图书管座位预约系统为例,F12打开浏览器开发者模式的网络界面,可以查看浏览器与服务器之间数据的交互过程。
首先打开目标网页,即向目标服务器发送一个get请求后,返回登陆界面的网页内容。
接着输入账号密码,点击登陆成功后,观察,浏览器其实向目标服务器又发送一个post请求,是一个包含五个参数的表单:SYNCHRONIZER_TOKEN
,SYNCHRONIZER_URI
,username
,password
,authid
。
我们多登陆几次,就发现规律。其中username
,password
很清楚就是登陆的账号密码,authid
默认为-1
,SYNCHRONIZER_URI
默认为/
。
而SYNCHRONIZER_TOKEN
每次都会变化,说明它一定是首次访问登陆页面服务器给动态返还的,而登陆页面返回的response header里没有它身影,我们就思考它可能隐藏在其他的地方或是计算出来的。我们再从网页的源码探寻,搜索相关字段,发现网页源代码里隐藏着此信息,它是一个隐藏式表单元素,如图所示:
现在就已经获取所有需要post的信息来源,接下来代码实现模拟登陆过程。
代码
这里最重要的一个变量就是request库的Session,它可以帮助我们维持一个会话,而且可以自动处理
Cookies,即登陆成功后,可以一直保留登录状态,爬取登陆后的页面。
接下来就是需要在首次访问登录页面时候提取出SYNCHRONIZER_TOKEN
字段的内容,实现在token()
函数里。
最后注意,这个网站登陆成功后浏览器会自动跳转另一个地址,所以我们真正需要爬取的内容在self.logined_url
里。
class Book_seat():
def __init__(self):
self.headers = {
'Referer':'http://seat1.lib.hlju.edu.cn/login?username=21814242',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0',
'Host':'seat1.lib.hlju.edu.cn'
}
self.login_url = 'http://seat1.lib.hlju.edu.cn/login?targetUri=%2F'
self.post_url = 'http://seat1.lib.hlju.edu.cn/auth/signIn'
self.logined_url = 'http://seat1.lib.hlju.edu.cn/'
self.session = requests.Session()
def token(self, url):
respone = self.session.get(url, headers = self.headers)
soup = BeautifulSoup(respone.text , 'lxml')
token = soup.select('#SYNCHRONIZER_TOKEN')[0]['value']
return token
def login(self, username = '2181424', pwd = '090613'):
post_data = {
'SYNCHRONIZER_TOKEN': self.token(url = self.login_url),
'SYNCHRONIZER_URI': '/login',
'username': username,
'password': pwd,
'authid': '-1',
}
response = self.session.post(self.post_url, headers= self.headers, data=post_data)
print('Open login url status(200 is normal):',response.status_code)
response = self.session.get(self.logined_url, headers=self.headers)
print('Open book seat url status(200 is normal)',response.status_code)
soup = BeautifulSoup(response.text, 'lxml')
#print(soup.prettify())
print('Login Successfully!')
总结
爬虫模拟登陆网站实际就是模拟浏览器向目标url发送表单的过程,最重要分析浏览器发送了什么,怎么获得的。