在python爬虫中如何处理cookie和session

使用python开发爬虫的过程中,遇到需要登录鉴权的一些页面,必不可少的会接触到cookie和session的使用。本文结合自己最近一次爬虫爬坑的经历,介绍在python爬虫中如何使用Cookie和Session
在这里插入图片描述

Cookie和Session的介绍

Cookie

Cookie 是一种用于跟踪用户会话信息的小型文本文件。它由服务器发送到用户的浏览器,然后由浏览器存储在用户的计算机上。每当用户访问同一站点时,浏览器都会将相关的 Cookie 发送回服务器,以便服务器可以使用它来识别用户并维护用户的状态信息

Session

Session 是一种用于在服务器端存储用户状态信息的机制。与 Cookie 不同,Session 数据存储在服务器上,而不是存储在用户的浏览器中。每个会话都有一个唯一的会话标识符(Session ID),通常存储在用户的 Cookie 中,用于在用户和服务器之间唯一标识会话。

为什么要用到Cookie和Session

假如我们要去访问一些需要登录的页面,爬取需要的信息,我们有以下三中方式:

  1. 人工把浏览器页面的请求header里cookie复制下来,写到python脚本里,这个方法无法保证cookie的时效性
  2. 模拟登录请求,通过代码模拟用户登录的过程,使用requests 库来发送请求,一旦登录成功,保存cookie,后续请求携带上cookie。
  3. 同样模拟登录,但是这里不用保存cookie,使用request.Session发送请求,登录成功,后续都直接使用这个session,服务器会将你视为已登录用户,进行正常的会话。
    第2种方式比较灵活,第3种方式使用起来比较方便,就像使用浏览器登录一样,不需要再考虑cookie的管理和请求添加cookie等,直接使用session发起请求就可以,这里比较推荐第3种方式

使用session保持会话的好处

在requests中,如果直接利用get()或post()等方法的确可以做到模拟网页的请求,但是这实际上是相当于不同的会话,也就是说相当于你用了两个浏览器打开了不同的页面。

设想这样一个场景,第一个请求利用post() 方法登录了某个网站,第二次想获取成功登录后的自己的个人信息, 你又用了一次get()方法去请求个人信息页面。实际上,这相当于打开了两个浏览器,这是两个完全不相关的会话,能成功获取个人信息吗?那当然不能。有小伙伴可能说了,我在两次请求时设置一样的cookies不就行了?可以,但这样做起来显 得很烦琐,我们有更简单的解决方法。

其实解决这个问题的主要方法就是维持同一个会话,也就是相当于打开一个新的浏览器选项 卡而不是新开一个浏览器。但是我又不想每次设置cookies,那该怎么办呢?这时候就有了新的利器一Session对象。利用它,我们可以方便地维护一个会话,而且不用担心 cookies 的问题,它会帮我们自动处理好。requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的。接下来我们就来学习它。

在python中如何使用Cookie

如果你已经有了个合法的cookie,可以直接这样使用:

requests.get(url=you_rurl, cookies=your_cookie)

后续每次请求都这样带着cookie就可以,比较繁琐,下面重点介绍如何使用Session

在python中如何使用Session

reqeust.Session()

# 新建一个会话
session = requests.Session()
# 使用这个会话发起一个请求,模拟登录
session.post(url=you_url, data={'你的参数'})
# 如果上一个请求成功,这个请求就可以直接获取到数据,因为session已经把上个请求返回的cookie自动带上了
session.get(url=you_url)

所以requests.session能自动处理 cookie , 下一次发起请求时会自动带上前一次的 cookie,不需要像使用cookie的方式一样每次都手动处理,极大的方便了请求的业务逻辑。

案例:使用session维持github会话

对这个案例进行分析有以下步骤:

  1. 对 github 登陆以及访问登陆后才能访问的页面的整个完成过程进行抓包分析,比如分析登录参数是什么
  2. 确定登陆请求的 url 地址、请求方法和所需的请求参数
  3. 部分请求参数在别的 url 对应的响应内容中,可以使用 re 模块获取
  4. 确定登陆后才能访问的页面的的 url 地址和请求方法
  5. 利用 requests.session 完成代码
import requests
import re
# 构造请求头字典
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (
KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',}
# 实例化session对象
session = requests.session()
# 访问登陆页获取登陆请求所需参数
response = session.get(https://github.com/login, headers=headers)
authenticity_token = re.search('name="authenticity_token" value="(.*?)" />',
response.text).group(1) # 使用正则获取登陆请求所需参数
# 构造登陆请求参数字典
data = {
'commit': 'Sign in', # 固定值
'utf8': ' ', # 固定值
'authenticity_token': authenticity_token, # 该参数在登陆页的响应内容中
'login':
input('输入github账号:'),
'password':
input('输入github账号:')}
# 发送登陆请求(无需关注本次请求的响应)
session.post(https://github.com/session, headers=headers, data=data)
# 打印需要登陆后才能访问的页面
response = session.get(https://github.com/settings/profile, headers=headers)
print(response.text)

最佳实践参考

使用session需要每次打开程序都登录,但是有的时候,登录信息并没有过期,如何真正像浏览器一样,及时关闭了浏览器再重新打开,只要cookie不过期,也不需要重新登录。这里就需要把cookie做持久化,然后加载cookie到session中,这样就能通过持久化的cookie构造一个session,避免重复多次登录。

cookie持久化存储和加载

登录成功后,把session中的cookie取出做持久化存储,这里存储到文件中。保存cookie的对象是RequestsCookieJar,我们需要把他转成字典,不能直接使用__dict__方法,需要使用两个特殊函数requests.utils.dict_from_cookiejar将RequestsCookieJar转成字典,然后再使用requests.utils.cookiejar_from_dict(new_cookie_jar),可以将字典转成RequestsCookieJar,参考下面代码:

####### 持久化存储
# 转成字典
cookiejar = requests.utils.dict_from_cookiejar(request_session.cookies)
# 转成json存储到文件中
# 登录成功, session里的cookie是最全的
    cookiejar = requests.utils.dict_from_cookiejar(request_session.cookies)
    with open(cookie_path, "w") as f:
        json.dump(cookiejar, f, indent=True)
    logging.info('cookies saved to ./data/cookie.txt')


####### 取出cookie加载到session
session = reqeust.Session()
with open(cookie_path, "r") as f:
    load_cookie = json.load(f)
    whv_logger.info(f"load_cookie from file: {load_cookie}")
    exist_cookies =  requests.utils.cookiejar_from_dict(load_cookie)
    session.cookies.update(exist_cookies)

完整的cookie持久化方案参考

在这里顶一个模块专门处理cookie的持久和加载,定义个全局变量request_session用来管理全局的会话。登录完成之后,调用save_cookie方法更新全局session

import json
import traceback

import requests.utils

cookie_path = './data/cookie.txt'
request_session: requests.Session = None

def __load_cookie():
    '''
    加载本地cookie,如果存在加载,如果不存在就返回空
    :param session:
    :return:
    '''
    try:
        with open(cookie_path, "r") as f:
            load_cookie = json.load(f)
            logging.info(f"load_cookie from file: {load_cookie}")
            return requests.utils.cookiejar_from_dict(load_cookie)
    except Exception as e:
        traceback.print_exc()
        logging.error("failed load cookie, error:%s", e)
        return None

def get_session():
    global request_session
    if request_session is not None:
        return request_session
    else:
        request_session = requests.Session()
        exist_cookies = __load_cookie()
        if exist_cookies is not None:
            request_session.cookies.update(exist_cookies)

        return request_session

def save_cookie():
    # 登录成功, session里的cookie是最全的,response返回的cookie不全
    cookiejar = requests.utils.dict_from_cookiejar(request_session.cookies)
    with open(cookie_path, "w") as f:
        json.dump(cookiejar, f, indent=True)
    logging.info('cookies saved to ./data/cookie.txt')


def update_cookie():
    '''
    这个方法需要具体场景具体分析,并不一定都用到。
    为什么需要一个新的session
    # 走到这一步,说明session已经过期,重新获取session,需要重新处理下session
    :return:
    '''
    error_cookie_jar = requests.utils.dict_from_cookiejar(request_session.cookies)
    # 替换自己需要处理的cookie中的参数
    new_cookie_jar = {'__RequestVerificationToken': error_cookie_jar['__RequestVerificationToken']}
    new_cookie = requests.utils.cookiejar_from_dict(new_cookie_jar)

    # 清空旧的cookie
    request_session.cookies.clear_session_cookies()
    # 填充新的cookie
    request_session.cookies.update(new_cookie)
  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程,如有问题或建议,请及时沟通。 5.期待你能在项目找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 实现扫码全流程脱离浏览器,后续添加功能很方便 新版本的北科教务管理系统没法使用密码登录,只能通过 **微信扫码** 才可以登录, 本程序实现了 **微信认证** 的认证过程,并且最终得到session 得到session之后就可以实现爬取所用数据,只需要简单设计Xpath路径和数据处理代码就可以爬取任何数据,这里我只简单弄了一些功能: 1. 微信认证登录(非chromedriver,使用的requests库) 2. 查看某学习的所有课程成绩(输入学期) 3. 查看某门课程成绩(支持关键词的模糊搜索方式,只需要课程名关键词就行) 4. 查看目前我的学业完成进度 菜单尝试使用多级菜单完成,后续自动选课功能实现起来也不难,主要理清楚选课流程就行,之前写过一份代码,等有时间再整理 ![img.png](img/img.png) ``` >> 查看某课程成绩(支持关键词模糊搜索) >> 课程名称: 电机 | 序号 || 开课学期 || 课程编号 || 课程名称 || 成绩 || 学分 || 总学时 || 补重学期 || 考试性质 || 课程性质 || 通选课类别 || 成绩类型 | | 10 ||2022-2023-1|| 4230016 || 电机及拖动 || xx || 2.5 || 40 || 正常考试 || 专业核心 || 主修 | 按回车继续 1. 登录教务管理系统 2. 获取某学期所有课程成绩 3. 查看某课程成绩(支持关键词模糊搜索) 4. 查看学业完成进度 5. 查看选课心课程 6. 返回上一级 7. 退出系统 3 >> 查看某课程成绩(支持关键词模糊搜索) >> 课程名称: 电路 | 序号 || 开课学期 || 课程编号 || 课程名称 || 成绩 || 学分 || 总学时 || 补重学期 || 考试性质 || 课程性质 || 通选课类别 || 成绩类型 | | 7 ||2021-2022-1|| xx ||电路分析基础AII || xx || 1.5 || 24 || 正常考试 || 学科平台 || 主修 | | 序号 || 开课学期 || 课程编号 || 课程名称 || 成绩 || 学分 || 总学时 || 补重学期 || 考试性质 || 课程性质 || 通选课类别 || 成绩类型 | | 11 ||2020-2021-2|| xx || 电路分析基础AI || xx || 3 || 48 || 正常考试 || 学科平台 || 主修 | 按回车继续 ```
如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的)。另外,您不会使用资源的话(这种情况不支持退款),也可以找我们帮助(需要追加额外费用) 爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
### 回答1: Python爬虫cookiesession是两个重要的概念。 Cookie是服务器在客户端存储的一小段文本信息,用于记录用户的登录状态、浏览历史等信息。在Python爬虫,我们可以使用requests库cookies参数来设置和获取cookie信息。 Session是一种记录用户状态的机制,它可以在不同的请求之间保持用户的登录状态。在Python爬虫,我们可以使用requests库Session对象来创建一个会话,从而实现登录、保持登录状态等操作。通过Session对象,我们可以方便地管理cookie信息,实现自动登录和持久化会话等功能。 ### 回答2: Python爬虫是指使用Python语言编写程序,自动获取互联网上的信息并进行数据分析或者存储的技术。而CookieSession则是爬虫程序常用的两种技术,它们的作用是帮助爬虫程序模拟网站的登录情况和维持网站和爬虫程序之间的会话状态,以便进行身份认证和绕过防护机制。 Cookie是存储在浏览器客户端的数据,主要用于表示用户身份、用户访问时间、用户信息等,如用户访问某个网站时会在浏览器创建一个Cookie,这个Cookie信息会被服务器进行读取和处理。当爬虫程序需要模拟网站登录时,需要获取并保存服务器返回的Cookie,以便后续更好的请求和响应网站数据。Python通过requests模块进行Cookie的使用。requests模块有一个Session对象,默认情况下,Session对象会存储Cookie到本地,这就相当于保存了用户的登录状态,方便后面的请求使用。在requests的get和post方法调用时,通过传递session对象作为第一个参数,就可以在整个请求过程使用保存过的Cookie信息。具体使用方法如下: ``` # 创建session对象 import requests session = requests.Session() # 网站登录请求 session.post(login_url, data=user_data) # 获取用户信息 user_info = session.get(user_url) ``` 而Session则是保存Web应用程序会话的数据结构,即Session是由Web应用程序使用的一种机制,该机制通过在客户端存储或通过增加HTTP Cookie的方式传递标识符来维护状态信息。Session的数据保存在服务器端,每次请求时都会带上保存在CookieSession ID,服务器根据Session ID来查找对应的Session对象。在Python,我们可以通过Flask、Django等Web框架来实现Session的使用。 综上,CookieSession爬虫程序非常重要的技术,能够帮助爬虫程序更好地模拟登录和保持会话,让爬虫程序更快速、准确地抓取网站信息。但需要注意的是,爬虫程序的使用需要遵守网站的相关规定和道德底线,不得违反相关法律法规和道德规范。 ### 回答3: Python爬虫是一个广泛应用于网络数据抓取和处理的技术。在Python爬虫cookiesession是非常重要的概念,它们有助于实现身份验证和保持用户会话状态。在本篇文章,我们将具体介绍cookiesessionPython爬虫的应用。 1. Cookie Cookie是一种客户端存储机制,通常由Web服务器在HTTP响应头返回。Cookie可以包含存储在客户端计算机上的信息,并在相应的HTTP请求发送回服务器。Python的Requests库可以方便地处理Cookie,使用方法如下: ``` import requests # 创建Session对象 s=requests.Session() # 访问登陆页,获取cookie s.get('http://www.example.com/login') # 从响应读取cookie cookie=s.cookies.get_dict() # 发送带有cookie的请求 s.get('http://www.example.com/user',cookies=cookie) ``` 从上面的代码可以看出,通过创建一个Session对象,我们可以在访问登陆页时获取Cookie,在后续请求Cookie发送回服务器。这种方式可以模拟用户登陆状态,方便爬取需要用户身份验证的数据。 2. Session Session是另一种用于跟踪用户会话状态的机制。与Cookie不同,Session是由Web服务器在服务器端管理的。当用户发送请求时,服务器会为用户创建一个Session,该Session在Web服务器上存储。Python也可以方便地使用Session处理会话状态,使用方法如下: ``` import requests # 创建Session对象 s=requests.Session() # 在Session发起请求 s.get('http://www.example.com/user') ``` 通过创建一个Session对象,我们可以在爬取时保持用户的会话状态,实现一些需要用户登录后才能进行的操作。与Cookie不同,Session的内部机制是由Web服务器实现的,并不需要我们自己去处理。 总结 从上述内容可以看出,CookieSessionpython爬虫起着至关重要的作用。Cookie可以方便地处理用户身份验证,从而实现一些需要用户身份验证的操作。而Session则可以方便地处理用户会话状态,为用户提供一种无缝的体验,在爬虫也有广泛的应用。因此,Python爬虫开发者应该熟练掌握CookieSession的用法,以便在爬取数据时更加高效、方便。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值