美文网首页
用 post 方法登陆知乎

用 post 方法登陆知乎

作者: bb2eef9c6b14 | 来源:发表于2017-06-17 16:12 被阅读978次

    在之前的课程中,我们主要使用了requests的get方法来直接获取网页的内容。支持GET方法的网页,接受我们的URL, 从URL里面取出参数,然后再将结果返回给浏览器。由于URL的长度是有限制的,所以只能接收少量的参数。而支持POST方法的网页,可以传递大量的参数和大量的信息。如果一个网页只支持POST方法,那这个网页是没有办法在浏览器里面直接输入网址访问的。requests的post方法支持将参数以POST方式提交给网页,并得到网页的返回信息。

    大多数的网站,登录的用户名和密码都是通过POST方式提交给服务器的,因此如果可以模拟网站的这个提交行为,就可以模拟登录网站。

    我们首先进入知乎的登录页面,打开Chrome的开发者工具的Network选项卡,勾选“Preserve log”并故意输入错误的账号和密码尝试登录,从Chrome抓取到的数据中我们可以找到我们需要的信息:

    从以上两张图中,我们可以看到,当我们点击了登录按钮以后,程序会将图二红框中的Form Data下面四个数据使用POST方式发送给图一红框中的https://www.zhihu.com/login/email这个URL。

    注意:如果你输入的账号不是手机号,而是邮箱,数据将会发送到的URL为:https://www.zhihu.com/login/phone_num

    上图中的Form Data,后三项的意义显而易见,email: 邮箱, password: 密码, remember_me: 记住我。但是第一项"_xsrf"是什么意思?它后面的一长串数据是哪里来的?

    这个时候大家打开登录页面的源代码,你将会找到这样内容:

    那么事情就简单了,使用正则表达式或者XPath先从源代码里面把这个xsrf提取出来,然后再和登录信息一起提交即可。

    还有一点需要注意:在Form Data中,remember_me后面的值是true, 首字母是小写的。但是在Python里面的布尔值True, 首字母需要大写。

    在一般情况下是不需要使用验证码登录的,所以只需要提供图二列出的信息,将它们写成一个字典并POST提交就能实现登录。那么如果遇到验证码怎么办呢?后面我们会有专门的课程将验证码的处理。

    现在,我们已经知道了登录知乎的原理,于是就可以通过代码来实现登录。核心代码如下:

    data = {'_xsrf': xsrf,'email':'邮箱','password':'密码','remember_me':True}session = requests.Session()result = session.post('https://www.zhihu.com/login/email', headers=header, data=data)#这里的result是一个json格式的字符串,里面包含了登录结果#之后访问知乎的其他页面,只需要使用session.get('网址', headers=header)这种格式front_page = session.get('https://www.zhihu.com', headers=header)print(front_page.content.decode())

    其运行效果如下图所示:

    网址返回的登录结果是登录成功,并且查看源代码可以证明是登录成功。

    对于其他的网站,整个流程是完全一样的,只是POST提交的参数各有不同。有些网址只需要POST提交用户名和密码就可以了,而另外一些网址,可能还需要从源代码里面提取更多的参数。

    相关文章

      网友评论

          本文标题:用 post 方法登陆知乎

          本文链接:https://www.haomeiwen.com/subject/lpqbqxtx.html