AI-数据采集-requests模块处理cookie(四)

举报
咔吧咔吧 发表于 2020/10/23 11:13:58 2020/10/23
【摘要】 requests模块处理cookie的相关请求 ● requests处理cookie的三种方法 ● 实现cookiejar类型和字典直接的相互转换 1. 爬虫中使用cookie 为了能够通过爬虫获取到登录后的页面,或者是解决通过cookie的反扒,需要使用request来处理cookie相关的请求 1.1 爬虫中使用cookie的利弊 ...

    requests模块处理cookie的相关请求

    ● requests处理cookie的三种方法

    ● 实现cookiejar类型和字典直接的相互转换

    

    1. 爬虫中使用cookie

    为了能够通过爬虫获取到登录后的页面,或者是解决通过cookie的反扒,需要使用request来处理cookie相关的请求

    

    1.1 爬虫中使用cookie的利弊

    带上cookie的好处

    ○ 能够访问登录后的页面

    ○ 能够实现部分反反爬

    ○ 带上cookie的坏处

    

    一套cookie往往对应的是一个用户的信息,请求太频繁有更大的可能性被对方识别为爬虫

    使用多个账号可以解决上述问题

    1.2 requests处理cookie的方法

    使用requests处理cookie有三种方法:   

    ○ cookie字符串放在headers中

    ○ 把cookie字典放传给请求方法的cookies参数接收

    ○ 使用requests提供的session模块

    

    2. cookie添加在heades中

    网站经常利用请求头中的Cookie字段来做用户访问状态的保持,那么我们可以在headers参数中添加Cookie,模拟普通用户的请求。我们以github登陆为例:

    

    2.1 github登陆抓包分析

    打开浏览器,右键-检查,点击Net work,勾选Preserve log

    访问github登陆的url地址 https://github.com/login

    输入账号密码点击登陆后,访问一个需要登陆后才能获取正确内容的url,比如点击右上角的Your profile访问https://github.com/USER_NAME

    确定url之后,再确定发送该请求所需要的请求头信息中的User-Agent和Cookie

·    image.png

    

    2.2 完成代码

    ◎ 从浏览器中复制User-Agent和Cookie

    ◎ 浏览器中的请求头字段和值与headers参数中必须一致

    ◎ headers请求参数字典中的Cookie键对应的值是字符串

    image.png

    运行结果大家记得自己动手去看看

    

    3. cookies参数的使用

    上面我们在headers参数中携带cookie,也可以使用专门的cookies参数

    cookies参数的形式:字典

    cookies = {"cookie的name":"cookie的value"}

    该字典对应请求头中Cookie字符串,以分号、空格分割每一对字典键值对

    等号左边的是一个cookie的name,对应cookies字典的key

    等号右边对应cookies字典的value


    cookies参数的使用方法

    response = requests.get(url, cookies)

    将cookie字符串转换为cookies参数所需的字典:


    cookies_dict = {cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split('; ')}

    注意:cookie一般是有过期时间的,一旦过期需要重新获取

import requests

url = 'https://github.com/USER_NAME'# 构造请求头字典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'}
# 构造cookies字典
cookies_str = '从浏览器中copy过来的cookies字符串'
cookies_dict = {cookie.split('=')[0]:cookie.split('=')[-1] for cookie in cookies_str.split('; ')}
# 请求头参数字典中携带cookie字符串
resp = requests.get(url, headers=headers, cookies=cookies_dict)

print(resp.text)

      

    cookie有过期时间 ,所以直接复制浏览器中的cookie可能意味着下一程序继续运行的时候需要替换代码中的cookie,对应的我们也可以通过一个程序专门来获取cookie供其他程序使用;当然也有很多网站的cookie过期时间很长,这种情况下,直接复制cookie来使用更加简单

    

    4. 使用requests.session处理cookie

    前面使用手动的方式使用cookie,那么有没有更好的方法在requets中处理cookie呢? 

    requests 提供了一个叫做session类,来实现客户端和服务端的会话保持

    

    会话保持有两个内涵:

    保存cookie,下一次请求会带上前一次的cookie

    实现和服务端的长连接,加快请求速度


    4.1 使用方法

    session = requests.session() # 实例化session对象

    response = session.get(url, headers, ...)

    response = session.post(url, data, ...)

    session对象发送get或post请求的参数,与requests模块发送请求的参数完全一致


    

    5. requests中cookieJar的处理方法

    使用requests获取的resposne对象,具有cookies属性。该属性值是一个cookieJar类型,包含了对方服务器设置在本地的cookie。我们如何将其转换为cookies字典呢?

    

    转换方法

    

# 将cookiejar转换成字典类型
cookies_dict = requests.utils.dict_from_cookiejar(response.cookies)
# 将字典类型转换成cookiejar类型
cookies_jar = requests.utils.cookiejar_from_jar(cookies_dict)

    其中response.cookies返回的就是cookieJar类型的对象

    requests.utils.dict_from_cookiejar函数返回cookies字典

                          

            

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。