为什么需要模拟登录呢?很多时候我们爬取一些网页的时候,站点会验证我们的请求身份。如果是未登录的用户,则拦截请求。这也是反爬虫的一种。
所以有时候我们需要先进行登录,这个时候就会引入Cookie
的概念
cookie是保存在客户端(浏览器)上的纯文本文件,里面回保存一些服务器返回的数据,比如用户信息、权限信息、失效时间等等
下面以豆瓣为例,比如我在浏览器中以登录的状态直接去请求某个用户的页面,是这样的https://www.douban.com/people/100000000/
在程序中,因为没有登录,访问同样的链接
response = requests.get(url, headers=headers)
with open('douban.html', 'w', encoding='utf-8') as f:
f.write(response.text)
执行完毕之后打开HTML,如下图所示
在程序中如何获取到跟浏览器一样的页面呢,先来说一下第一种方法,比较死板的,就是在请求头headers中写入Cookie信息
cookie是由发送post登录请求之后,由服务端创建返回的
代码如下:
response = requests.get(url, headers=headers)
with open('douban.html', 'w', encoding='utf-8') as f:
f.write(response.text)
执行之后,打开douban.html
,发现正常获取数据了
这种方式不是很灵活,因为你需要经常的去替换Cookie信息。
所以一般通过模拟登录的方式动态的获取Cookie信息。这时候就引入了session会话对象,在请求的过程中,如果产生了Cookie,则会将cookie信息进行存储到session对象中。
下面就需要使用session对象来模拟登录, 输入账号密码,之后点击登录,观察调试控制,发现有下图的标识的URL,就是登录请求
参数如下所示,name就是手机号,password明文传输,并没有进行加密。并且是form表单提交
代码和注释如下:
这里需要注意的是请求头中需要添加referer
用来标识登录请求是从referer这个链接发送的,不然请求会被拦截。
}
# 创建一个session对象
session = requests.Session()
login_url = 'https://accounts.douban.com/j/mobile/login/basic'
data = {
'ck': '',
'remember': 'true',
'name': '手机号码',
'password': '密码'
}
# 使用session对登录的post请求 进行发送
response = session.post(url=login_url, data=data, headers=headers)
# 查看是否登录成功
if response.status_code != 200:
print('登录失败')
print(session.headers)
# 登录成功之后cookie会加载到session对象中,然后通过session进行get请求
info = session.get('https://www.douban.com/people/100000000/', headers=headers)
with open('douban.html', 'w', encoding='utf-8') as f:
f.write(info.text)
执行之后,打开HTML如下图所示,证明模拟登录成功。
总结:整个过程都是围绕Cookie进行的,而Cookie的一大特性是无状态,所以我们可以通过requests创建一个session对象,来承载登录之后返回的Cookie信息。后续直接通过session(已经携带了Cookie)去发送get请求即可,
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 你用什么电脑学python?10/19
- ♥ 如何在python中拆分字符串10/18
- ♥ 如何解决python无法连接数据库09/23
- ♥ python == 是什么意思08/25
- ♥ 如何检查 python.exe 文件在哪里?08/29
- ♥ python如何使用read读取不同类型的文件12/18
内容反馈