浏览器用一行JS代码导出cookies.txt,Python的requests库导入cookies格式化为字典格式

news/2024/4/20 14:16:21/文章来源:https://blog.csdn.net/Scott0902/article/details/129166907

在Python进行爬虫时,如果仅使用requests库打开某个网页,requests的session.cookies保存的cookies信息少得可怜,有时cookies甚至是空白!但浏览器里打开同一个网页,cookies信息非常详尽,比如浏览器的cookies保留了登录之后的状态信息,为了Python免登录快速进入某个网页,我们需要先将浏览器的网页cookies导出,然后在Python里使用requests库导入cookies。

第一步:浏览器导出文本格式的cookies.txt

在浏览器的地址栏里可以输入以下JS代码,快速导出当前页面的cookies为一个文本文件cookies.txt:

javascript: (function() { const a = document.createElement('a');  a.href = 'data:text/plain,' + document.cookie;  a.download = 'cookies.txt';  a.target = '_blank';  a.style.display = 'none';  document.body.appendChild(a);  a.click();  setTimeout(function() {    document.body.removeChild(a);  }, 100);})();

注意:不能直接粘贴以上的代码,否则浏览器会自动屏蔽掉开头的“javascript:”。

正确的姿势是:先在地址栏里输入或粘贴 javascript: (注意带冒号而且是半角的),然后再粘贴上面的JavaScript:后面的代码,敲回车,这样就能导出cookies.txt到指定的目录。

浏览器如果没有弹出保存文件的对话框,是因为浏览器设置了自动保存到默认的目录,如C:\Users\Administrator\Downloads\。如果需要浏览器每次保存文件都要咨询你保存到哪里,就要先在浏览器的设置里找到下面的设置:

 第二步:Python的requests库导入cookies.txt为字典格式

Requests库的session可以导入cookies,要求cookies必须是字典格式。

上面导出的cookies.txt只有一行,举个例子:

mediav={"_refnf":0};ID=ed5026a06; param={"user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)","token":""}; cookie_referer=; token=validation:token

这只是为了方便展示而举个简单的例子,实际的cookies字符串会比这个更长。

前辈的做法是按分号来分割字符串,然后用dict()转成字典格式。但遇到这个例子,user-agent值也有分号,如果简单地按分号分割,分割出来再转字典格式会出错。

我的做法是:按等号分割,然后再去除多余的分号。

with open('cookies.txt', encoding = 'utf-8') as f:cookies = f.read()
'''
载入cookies.txt,假设cookies内容是:'mediav={"_refnf":0};ID=ed5026a06; param={"user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)","token":""}; cookie_referer=; token=validation:token'
'''l1=cookies.split('=')
print(l1)'''
输出:
['mediav', '{"_refnf":0};ID', 'ed5026a06; param', '{"user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)","token":""}; cookie_referer', '; token', 'validation:token']
'''

可以看到 l1 列表的偶数元素混杂了键和值,需要去除多余的分号,就要把它们拆散,下面是我改进的代码:

def cookies_to_dict(cookies):l1=l2=[]l1=cookies.split('=')for i in l1:if ';' in i:# 如果字符串存在分号就从后往前找分号来分割ss = i.rpartition(';')# rpartition()的作用就是从后往前找,返回三个元素的元组# 第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串# 因此这里使用extend一次添加ss[0]和ss[2]的子串l2.extend([ss[0].strip(), ss[2].strip()])# strip()的作用是清除子串左端和右端的多余的空格else:l2.append(i.strip())c_dict={}for i in range(0,len(l2),2):c_dict.update({l2[i]:l2[i+1]})return c_dictcookie_dict = cookies_to_dict(cookies)
print(cookie_dict)'''
输出:
{'mediav': '{"_refnf":0}', 'ID': 'ed5026a06', 'param': '{"user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)","token":""}', 'cookie_referer': '', 'token': 'validation:token'}
'''

这样cookies.txt就格式化成字典格式了。接下来就可以导入进requests的session里。

import requestsse = requests.Session()se.cookies.clear()
# 先清空Session的cookies,再导入cookies_dict
se.cookies.update(cookies_dict)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72873.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

孪生生产线:法兰工厂数据驱动的颠覆性创新

2018 年,世界经济论坛(WEF)携手麦肯锡公司共同倡议并正式启动了全球“灯塔工厂网络项目”(Lighthouse Network),共同遴选率先应用工业革命 4.0 技术实现企业盈利和持续发展的创新者与示范者。这就使得工厂系统需要对各流水线及生产运行成本方面进行多角度…

在DDD中建立领域模型

在前文《当我们谈论DDD时我们在谈论什么》中我们讨论了DDD的战略设计和战术设计。在本文中我们将继续探讨领域模型。 用领域模型表达领域概念 在实际项目中,模型设计者往往过早陷入具体构造块类型的识别,比如实体、聚合、领域服务,而忽略了…

Git(分布式版本控制系统)

提到git了,我们先来说一下什么是git? 1、通俗一点,就是一个人工版本控制器 通过人工的复制行为来保存项目的不同阶段的内容,添加适当的一些描述文字加以区分 繁琐、容易出错 产生大量重复数据 2、什么是版本控制? 版本控制是指对…

动作识别、检测、分割、解析相关数据集介绍

文章目录动作识别UCF101(UCF101 Human Actions dataset)Kinetics (Kinetics Human Action Video Dataset)动作检测 / 时序动作定位CharadesActivityNetMulti-THUMOSUCF101-24IKEA ASM动作分割Breakfast (The Breakfast Actions Dataset)GTEA (Georgia Tech Egocentric Activity…

Python base64和hashlib模块

一、base64模块 base64模块提供了在二进制数据和可打印ASCII字符间编解码的功能,包括 RFC3548中定义的Base16, Base32, Base64, Ascii85, Base85等编码。 base64模块属于标准库,无需进行安装,导入即可使用。 base64模块支持两种接口&#xf…

数组还是队列?yocto-queue 源码告诉你

前言 昨天刚学完 omit 的源码,今天趁着学习源码的热度还没结束,来学习一下另一个我之前未接触过的东西 yocto-queue。 yocto-queue 介绍 那么 yocto-queue 是什么呢?它有什么功能呢?查阅资料可得,对于数据比较多的数…

第10天-商品服务(分层领域模型及规格参数编码实现)

1.分层领域模型规约 DO( Data Object): 此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。DTO( Data Transfer Object):数据传输对象, Service 或 Manager 向外传输的…

【Python】PaddleHub图像分类

目录 一、环境配置: 二、问题需求 三、实验内容 1、准备数据集 2、拆分数据集 3、载入数据集 4、生成数据读取器 5、配置策略 6、组建Finetune Task 7、开始Finetune 8、预测 四、总结: 一、环境配置: 线上环境: 飞桨…

JAVA线程入门简介

线程入门简介什么是程序?什么是进程?什么是线程?单线程与多线程并发与并行线程的使用用java查看有多少个cpu创建线程的两种方式继承Thread类,重写run方法实现Runnable接口,重写run方法多线程机制为社么是start?源码解析什么是程序? 是为完…

字符串转换为二进制-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-4】 字符串转换为二进制 【案例介绍】 1.任务描述 本例要求编写一个程序,从键盘录入一个字符串,将字符串转换为二进制数。在转换时,将字符串中的每个字符单独转换为一个二进制数,将所有二进制数连接起来进行输出。 案…

win10下 WSL2安装及配置

目录 一. Windows中WSL2(子系统)安装前提条件 二. Windows中WSL2(子系统)安装步骤(默认安装C盘) 选择包安装模式(选择到其他盘安装) 三. Windows中WSL2(子系统)设置默认root用户登…

35-Golang中的方法

Golang中的方法方法的介绍和使用方法的声明和调用方法的调用和传参机制原理方法的声明(定义)方法注意事项和细节讨论方法和函数的区别方法的介绍和使用 在某些情况下,我们需要声明(定义)方法。比如person结构体,除了有一些字段外(年龄,姓名……

Apollo规划模块代码学习(1): 算法架构原理、运行机制一文详解

文章目录 1、Apllo算法框架原理2、Apollo规划模块概述3、规划模块代码框架1、重要数据结构2、运行机制1、Apllo算法框架原理 Apollo开源自动驾驶平台中,高清地图模块提供了每个在线模块都可以访问的高清地图。感知和定位模块提供了必要的动态环境信息,可以在预测模块中进一步…

优思学院:六西格玛管理的优势有哪些?

六西格玛的优势有哪些呢?以下我们来探讨一下。 一・降低企业整体成本 对企业而言,不良品要么被废弃,要么需要重新加工,或者需要在客户现场维修或更换,这些都会增加企业成本。根据美国的统计数据,执行3σ管…

Socket编程 | TCP服务器 之 并发阻塞模型(多进程实现)

TCP服务器IO模型 之 并发阻塞 1. 引言 在 Linux 环境下多进程的应用很多,其中最主要的就是网络/客户服务器。多进程服务器是当客户有请求时,服务器用一个子进程来处理客户请求。父进程继续等待其它客户的请求。这种方法的优点是当客户有请求时,服务器能及时处理客户,特别是…

docker 部署centos7.9并打包成docker

下载centos基础镜像 docker pull centos:centos7 运行镜像 docker run -itd --name centos-test -p 60001:22 --privileged centos:centos7 /usr/sbin/init 进入容器 docker exec -it ebec90068696 /bin/bash 配置容器信息 安装ssh服务和网络必须软件 yum install net-to…

MongoDB在Windows、Linux、Docker环境下的安装

MongoDB在Windows、Linux、Docker环境下的安装DockerDocker安装远程连接WindowsWindows安装服务相关命令压缩包形式安装Mac、Ubuntu、Centos一键安装MacUbuntucentos源码安装使用Atlas免费MongoDB云数据库申请云数据库连接测试Docker Docker安装 拉取镜像 docker pull mongo…

洛谷P5736 【深基7.例2】质数筛 C语言/C++

【深基7.例2】质数筛 题目描述 输入 nnn 个不大于 10510^5105 的正整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。 输入格式 第一行输入一个正整数 nnn,表示整数个数。 第二行输入 nnn 个正整数 aia_iai​&…

数据结构与算法(二)(Python版)

数据结构与算法(一)(Python版) 文章目录递归动规初识递归:数列求和递归三定律递归的应用:任意进制转换递归的应用:斐波那契数列递归调用的实现分治策略与递归优化问题和贪心策略找零兑换问题贪心…

系列四、多表查询

一、多表关系 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结 构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多…