提前声明:该专栏涉及的所有案例均为学习使用,如有侵权,请联系本人删帖!
一、前言
在上篇文章中,我们手动登录csdn的开源广场网站(传送门:https://blog.csdn.net/qq_40558166/article/details/120723759),抠取了cookie,那么我们在访问其他内容后,都需要每次放入cookie,有些麻烦。那么今天我们使用session来登录该网站。
二、简单了解一下cookie和session
1.cookie和session的区别
- cookie在客户的浏览器上,session存在服务器上
- cookie是不安全的,且有失效时间
- session是在cookie的基础上,服务端设置session时会向浏览器发送设置一个设置cookie的请求,这个cookie包括session的id当访问服务端时带上这个session_id就可以获取到用户保存在服务端对应的session
2.爬虫处理cookie和session
- 带上cookie和session的好处:能够请求到登录后的界面
- 带上cookie和session的弊端:一个cookie和session往往和一个用户对应,访问太快容易被服务器检测出来爬虫
- 不需要cookie的时候尽量不要用
3.session请求方式
request提供了一个一个叫做session的类,来实现客户端和服务端的会话保持
使用方法:
- 实例化一个session对象
- 让session发送get或post请求
- 再使用session访问只有登录之后才能访问的网站,这时候session会自动带上服务器保存在其中的信息进行访问
session=request.session() #实例化session对象
response=session.get(url,header) #使用session对象发送get请求 就能获取服务端设置的session对象
三、代码分析
首先我们拿过上次的代码,开始改造
# -*- coding: utf-8 -*-
import requests
url = 'https://codechina.csdn.net/explore/welcome'
headers = {
'Cookie': '...',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36'
}
# 请求,verify=False 跳过ssl验证
response = requests.get(url, headers=headers, verify=False)
response.encoding = 'utf-8'
if '不愿透露姓名の网友' in response.text:
print('cookie有效')
else:
print('cookie无效')
首先我们不使用cookie登录,我们使用session进行请求
session = requests.Session()
url = 'https://codechina.csdn.net/explore/welcome'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36'
}
response = session.get(url, headers=headers, verify=False)
response.encoding = 'utf-8'
if '不愿透露姓名の网友' in response.text:
print('cookie有效')
else:
print('cookie无效')
然后我们塞入cookie,session中的cookie不能传入字符串,需要按键值对传入
session.cookie[key]=value
将字符串变成字段的方法封装
def cookie_to_dic(cookie_str):
"""将cookie字符串转为cookie字典"""
dic = {}
for i in cookie_str.split('; '):
dic[i.split('=')[0]] = i.split('=')[1]
return dic
放入cookie
然后再使用该session访问其他的页面,可以直接访问成功
四、完整代码
# -*- coding: utf-8 -*-
import requests
def cookie_to_dic(cookie_str):
"""将cookie字符串转为cookie字典"""
dic = {}
for i in cookie_str.split('; '):
dic[i.split('=')[0]] = i.split('=')[1]
return dic
# 不放入cookie
session = requests.Session()
url = 'https://codechina.csdn.net/explore/welcome'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36'
}
response = session.get(url, headers=headers, verify=False)
response.encoding = 'utf-8'
if '不愿透露姓名の网友' in response.text:
print('cookie有效')
else:
print('cookie无效')
# 放入cookie
cookie_str = '...'
cookie_dict = cookie_to_dic(cookie_str)
for key, value in cookie_dict.items():
session.cookies[key] = value
response = session.get(url, headers=headers, verify=False)
response.encoding = 'utf-8'
if '不愿透露姓名の网友' in response.text:
print('cookie有效')
else:
print('cookie无效')
# 访问新页面
url_2 = 'https://codechina.csdn.net/courses'
response_2 = session.get(url)
response_2.encoding = 'utf-8'
if '不愿透露姓名の网友' in response_2.text:
print('cookie有效')
else:
print('cookie无效')
成功