1、模拟登陆主要就是用POST方法给知乎服务器提交用户登陆相关的信息,POST的表头和表单的填写都可以通过抓取一个实际的登陆过程仿照,如下,按F12然后登陆后记录下其中一次浏览器向服务器提交的请求过程
2、需要填写表头,这个可以在谷歌浏览器里面打开F12,然后真实触发一次知乎登陆,把对应的表头模拟下来,如下
<span style="font-size:18px;"><span style="font-size:18px;">self.loginHeaders = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36',
'Referer': 'https://www.zhihu.com',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
}</span></span>
3、由于是登陆,所以需要提交表单,表单信息主要包括账号、密码以及_xsrf,主要_xsrf可以通过登陆跟踪获取
<span style="font-size:18px;"><span style="font-size:18px;">self.post = {
'email': "",
'password': "" ,
'rememberme':"true",
'_xsrf': "14a654d344b558f4bf5001ef6595ecd6"
}</span></span>
表单还需要编码一次,如下
<pre name="code" class="python">self.postData = bytes(urllib.parse.urlencode(self.post), 'utf-8')
4、将表头表单填入request消息中,会返回一个信息,代表登陆成功,如下veriCode获取
request = urllib.request.Request(self.siteURL, self.postData, self.loginHeaders)
response = self.opener.open(request)
veriCode= response.read().decode('gbk')
{"r":0,
"msg": "\u767b\u9646\u6210\u529f"
}
遗留问题:
1、知乎登陆多次会要求输验证码,怎么解决?
2、如何保存一次cookie后续不用再登陆?
3、请求的网页的编码格式怎么转换成自己需要的编码格式?
已经找到现成的代码,研究代码背后的动机再解决自己的疑问。