Cookie和Post模拟登陆

借助Chrome直接获取到Cookie,不过这种方式有局限性,并不如Fiddler通用,有一些网站使用这种方式获取的Cookie无法登录。

经过测试,这种方式对知乎有效。

在已经登录知乎的情况下,打开开发者工具,定位到 Network 选显卡,然后刷新网页,在加载的内容中,随便选择一项,然后看右侧的数据,如下图所示:

这里写图片描述
在右侧的Request Headers下面,你可以找到Cookie这一项,它后面的一长串数据就是我们需要的Cookie。

请注意这里一定要是”Request Headers”,不要选成了”Response Headers”。

使用这种方式获取的Cookie比使用Fiddler获取的Cookie要长几十个字符,不过不影响正常使用。以下是获取知乎回答的一个例子:

这里写图片描述
源代码中出现了“私信”和“我的首页”这两链接,说明是以登录的身份获取的源代码。

我们现在已经有这一段“登录后”的Cookie了,所以如果我们的脚本访问网站的时候,把这段代码一并提交上去,就可以让网站以为我们已经登录过,于是直接显示登录后的内容。

使用Cookie来登录网页,有时候可以直接绕过网站的验证码。

借助requests的Session模块,我们可以用几行代码加Cookie来实现登录知乎。

session = requests.Session()
cookie = {'Cookie': '一长串文本'}
html = session.get('网址', cookies=cookie).content
print(html.decode())

获取网页的时候,网址可以随便修改,只要保证每次都有cookies=cookie这个参数,就可以正常访问登录以后才能访问的页面。

Post模拟登陆

在之前的课程中,我们主要使用了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提交用户名和密码就可以了,而另外一些网址,可能还需要从源代码里面提取更多的参数

模拟登陆豆瓣代码

import requests
import re


login_url = 'https://accounts.douban.com/login'
user_url = 'https://www.douban.com/people/{}/'
email = '[email protected]'
password = '8888888'

data = {'source': None,
        'redir': 'https://www.douban.com/',
        'form_email': email,
        'form_password': password,
        'remember': 'on',
        'login': '登录'}

header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}

session = requests.Session()
html = session.get(login_url, headers=header).content.decode()

captcha_url = re.findall('id="captcha_image" src="(.*?)"', html, re.S) #获取验证码url
if captcha_url:
    captcha_url = captcha_url[0]
    captcha_id = re.findall('name="captcha-id" value="(.*?)"', html, re.S)[0] #获取验证码ID

    with open('captcha.png', 'wb') as f:
        f.write(requests.get(captcha_url).content)

    captcha_solution = input('captcha code is:')
    data['captcha-solution'] = captcha_solution
    data['captcha-id'] = captcha_id

result = session.post(login_url, data=data, headers=header).content

user_id = input('请输入用户id:')
while user_id != 'exit':
    user_info = session.get(user_url.format(user_id)).content
    print(re.findall('title>(.*?)</title', user_info.decode(), re.S)[0])
    user_id = input('请输入用户id:')
版权声明:本文为nalanyu2000原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/nalanyu2000/article/details/78528532

智能推荐

1638 统计只差一个字符的子串数目(动态规划)

1. 问题描述: 给你两个字符串 s 和 t ,请你找出 s 中的非空子串的数目,这些子串满足替换一个不同字符以后,是 t 串的子串。换言之,请你找到 s 和 t 串中恰好只有一个字符不同的子字符串对的数目。比方说, "computer" 和 "computation"...

websocket基本原理

HTTP中一个request只能有一个response。而且这个response也是被动的,不能主动发起 因此过去的服务端推送信息是通过客户端不停的轮询实现的 websocket是双向通信协议,提供了服务端主动推送信息的能力 需要客户端(浏览器)和服务端同时支持 如果经过代理的话,还需要代理支持,否则有些代理在长时间无通信时会自动切断连接 因此WS为了保证连接不被断掉,会发心跳 WebSocket...

mybatis+ehcache二级缓存

导入jar包 mapper.xml文件开启二级缓存 pojo类实现序列化接口 配置ehcache.xml 测试...

python+opencv实现图像拼接

任务 拍摄两张图片去除相同部分,拼接在一起 原图 结果 步骤 读取两张图片 使用sift检测关键点及描述因子 匹配关键点 处理并保存关键点 得到变换矩阵 图像变换并拼接 代码实现 扩展 这里对右边图像进行变换,右边变得模糊,可以修改代码对左边图像变换 这里只有两张图片拼接,可以封装实现多张图片拼接 可以修改代码实现上下图片的拼接...

python_sklearn机器学习算法系列之AdaBoost------人脸识别(PCA,决策树)

          注:在读本文之前建议读一下之前的一片文章python_sklearn机器学习算法系列之PCA(主成分分析)------人脸识别(k-NearestNeighbor,KNN)         本文主要目的是通过一个简单的小...

猜你喜欢

memmove函数与memcpy函数的模拟实现

memmove函数和memcpy函数都是在内存复制任意类型的,但是它俩也有区别。当源区域和目标区域有重复的,memmove函数会复制缓冲区重叠的部分,而memcpy相反,会报出未知错误。 下面给出两个函数的实现 首先,memmove函数。 实现的基本原理如下图。 具体代码如下: memcpy函数的实现很简单,就直接给出源代码了...

SpringFramework核心 - IOC容器的实现 - 总结

1. 概述 把Spring技术内幕第一章和第二章过了一遍,也做了一些笔记, 对IOC容器的实现有了一定皮毛理解,现在跟着源码再过一遍总结一下IOC容器的初始化,Bean的初始化的过程,做一下总结 ① IOC容器和简单工厂模式 在开始之前,先想想我们平时是怎么使用IOC容器为我们管理Bean的,假设我们要把下面的User类交给IOC容器管理 我们不想关心如何创建一个User对象实例的,仅仅在需要他的...

Python和Django的安装

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈  一、下载并安装Python Python 官方下载地址:http://www.python.org/ftp/python/ 我们这里选择的是 Python 2.7.2 。虽然目前最新版是Python 3.2.2, 但是Django目前还不支持 Python 3.2.2。 安装步骤很简单,双击安装包开...

OpenStack代码贡献初体验

为什么80%的码农都做不了架构师?>>>     OpenStack如今已成为开源云平台中的明星项目,得到广泛关注。OpenStack的优秀出众依赖于众多开发者的努力,在享受其带来的便利与快捷的同时,为其做一份贡献也是一个开发者的义务。  在前段时间的OpenStack的测试过程中,我发现Nova项目中的一个Bug,于是向社区提交了Bug报...