HTTP协议是无状态的,因此,若不借助其他手段,远程的服务器就无法知道以前和客户端做了哪些通信.Cookie就是“其他手段”之一。饼干一个典型的应用场景,就是用于记录用户在网站上的登录状态。
-
<李>用户登录成功后,服务器下发一个(通常是加密了的)饼干文件。李>
<李>客户端(通常是网页浏览器)将收到的饼干文件保存起来。李>
<李>下次客户端与服务器连接时,将饼干文件发送给服务器,由服务器校验其含义,恢复登录状态(从而避免再次登录)。李>
当浏览器作为客户端与远端服务器连接时,远端服务器会根据需要,产生一个SessionID,并附在Cookie中发给浏览器。接下来的时间里,只要饼干不过期,浏览器与远端服务器的连接,都会使用这个SessionID;而浏览器会自动与服务器协作,维护相应的饼干。
在<代码> 代码>中,请求也是这样。我们可以创建一个<代码>请求。会话> 代码,尔后在该会话中与远端服务器通信,其中产生的Cookie, <代码> 代码>请求会自动为我们维护好。
发布方法可以将一组用户数据,以表单的形式发送到远端服务器。远端服务器接受后,依照表单内容做相应的动作。
调用<代码> 代码>请求的发布方法时,可以用<代码> 代码>数据参数接收一个Python字典结构。<代码> 代码>请求会自动将Python字典序列化为实际的表单内容,例如:
进口的要求 cs_url=' http://httpbin.org/post ' my_data=https://www.yisu.com/zixun/{“key1”:“value1”, “key2”:“value2” } r=请求。帖子(cs_url, data=https://www.yisu.com/zixun/my_data) 打印r.content
模拟登录的第一步,首先是要搞清楚我们用浏览器登录时都发生了什么。
GitHub登录页面是https://github.com/login。我们首先清空浏览器饼干记录,然后用Chrome打开登录页面。填入用户名和密码之后,我们打开夯铬和铬的元素审查工具(找到网络标签页),之后点登录按钮。
在夯Chrome中,我们发现,虽然登录页面是https://github.com/login,但实际接收表单的是https://github.com/session。若登录成功,则跳转到https://github.com/首页,返回状态码<代码> 200 代码>。
而在Chrome的审查元素窗口中,我们可以看到提交给会话<代码> 代码>接口的表单信息。内里包含
-
<李>提交李>
<李> utf8李>
<李> authenticity_token李>
<李>登录李>
<李> 李>密码
其中,<代码> 代码>和<代码> utf8> 代码两项是定值;<代码>登录代码>和<代码>密码> 代码分别是用户名和密码,这很好理解。唯独<代码> authenticity_token 代码>是一长串无规律的字符,我们不清楚它是什么。
后动作发生在与会话<代码> 代码>接口交互之前,因此可能的信息来源只有<代码>登录代码>接口。我们打开登录页面的源码,试着搜索<代码> authenticity_token> 代码就不难发现有如下内容:
输入name=& lt;“authenticity_token”类型=耙亍钡募壑?癶ttps://www.yisu.com/zixun/.....”。/在
原来,所谓的<代码> authenticity_token> 代码是明白写在HTML页面里的,只不过用<代码> 代码>隐藏模式隐藏起来了。为此,我们只需要使用Python的正则库解析一下,就好了。
进口的要求 进口再保险 login_url=' https://github.com/login ' 用户=坝没А?/具体账号 密码='密码'//具体密码 user_headers={ “用户代理”:“Mozilla/5.0(麦金塔电脑;Intel Mac OS X 10 _9_5) AppleWebKit/537.36 (KHTML,像壁虎)Chrome/48.0.2564.116 Safari/537.36”, “接受”:“text/html、application/xhtml + xml应用程序/xml; q=0.9,图像/webp */*; q=0.8”, “接受编码”:gzip, “接收语言”:“应用,zh型;q=0.8, en; q=0.6, zh-TW; q=0.4” } 会话=requests.Session () 响应=会话。get (login_url header=user_headers) 模式=re.compile (r & lt;输入name=" authenticity_token类型=耙亍眝alue=" https://www.yisu.com/zixun/(. *)”/祝辞”) authenticity_token=pattern.findall (response.content) [0] login_data=https://www.yisu.com/zixun/{“提交”:“签到”, “use utf8”:“% E2 % 9 c % 93”, “authenticity_token”: authenticity_token,“登录”:用户, “密码”:密码 } session_url=' https://github.com/session ' 响应=会话。帖子(session_url头=user_headers, data=https://www.yisu.com/zixun/login_data)python请求模拟登陆github的实现方法