Python下使用requests库遇到的问题及解决方案

news/2024/7/19 12:19:16 标签: python, 开发语言, php, 数据库, 爬虫

每一盏灯都有一个故事……当凌晨2点我的房间灯还亮着时,那就是我与BUG的一场生死博弈。一个人静静地坐在电脑前不断地写代码,感觉快要麻木了,好比闭关修炼一样枯燥无味。最终当我打通任督二脉后,bug修复迎来的一片曙光。

在这里插入图片描述

一、问题背景

在最近的项目中,我使用Python 3.6和DigestAuth进行身份验证时遇到了一个令人困扰的问题。我发现,在使用requests库时,由于Python 3的一个已知问题(https://bugs.python.org/issue28967),无法将requests对象进行pickle序列化。这个问题的根本原因在于Python 3.6中的_thread._local对象无法被正确pickle化。尽管这个问题在Python 3.5.4中已经得到了修复,但在Python 3.6中仍然存在。这个问题可能会影响到需要pickle功能的应用程序,因为无法保存和恢复请求会话对象。

二、解决方案

为了解决这个问题,我们需要禁用requests库中的_thread._local对象。以下是解决方案的步骤:

1、导入必要的库和模块:

python">import requests
from requests.auth import HTTPDigestAuth

2、创建一个新的HTTPDigestAuth类,我们称之为NoLocalAuth,该类继承自HTTPDigestAuth类,并覆盖了__getattribute__方法:

python">class NoLocalAuth(HTTPDigestAuth):
    def __init__(self, username, password):
        super().__init__(username, password)

    def __getattribute__(self, name):
        if name.startswith('_'):
            raise AttributeError(name)
        return object.__getattribute__(self, name)

在NoLocalAuth类的__getattribute__方法中,我们检查属性名称是否以下划线开头,如果是,就会引发AttributeError异常,从而阻止了对_thread._local对象的访问。

3、使用新的NoLocalAuth类创建一个requests.Session对象,并进行pickle序列化:

python">session = requests.Session(auth=NoLocalAuth('user', 'passwd'))
pickle.dumps(session)

通过上述代码,我们创建了一个使用NoLocalAuth类的requests.Session对象,成功地将其pickle化,而不会受到_thread._local对象的干扰。

这个解决方案有效地解决了在Python 3.6下使用DigestAuth时无法pickle化requests对象的问题。通过禁用_thread._local对象,我们确保了我们的应用程序能够正常运行,并且这种方法也具有一定的通用性,可用于解决类似的问题。

希望这篇文章对解决Python 3.6下的pickle问题有所帮助,让您的项目顺利进行!如果您有任何疑问或需要进一步的帮助,请随时提问。

完美解决Python下的pickle问题,那么使用requests库爬取数据就一帆风顺了,不过这里需要注意的是。除了有requests库支持外,对于网站的防封策略也应该注重,尤其是地址封禁限制访问的问题也需要得到解决,如用第三方的爬虫ip实时切换地址防止网站跳验证码。如果有更多的代码问题可以一起交流。


http://www.niftyadmin.cn/n/5201155.html

相关文章

LLM之Prompt(二):清华提出Prompt 对齐优化技术BPO

论文题目:《Black-Box Prompt Optimization: Aligning Large Language Models without Model Training》 论文链接:https://arxiv.org/abs/2311.04155 github地址:https://github.com/thu-coai/BPO BPO背景介绍 最近,大型语言模…

基于JPBC的无证书聚合签名方案实现

基于JPBC的无证书聚合签名方案实现 摘要 一开始签名方案是基于PKI的,无证书签名起源于 基于身份密码体制, 2009 年第一篇无证书签名方案1被提出,随后出现了一些列方案2,3;包括无配对的无证书聚合签名方案4,更多内容参考文献5. 暂时没有看见…

模电 01

一.半导体基本知识 1.优点:体积小、重量轻、使用寿命长、输入功率小、功率转换效率高。 2.性能介于导体与绝缘体 3.常用半导体材料:硅(SI) 镉(Ge),化合物半导体:砷化镓(GaAs&…

2023年【上海市安全员C3证】考试内容及上海市安全员C3证复审考试

题库来源:安全生产模拟考试一点通公众号小程序 上海市安全员C3证考试内容是安全生产模拟考试一点通总题库中生成的一套上海市安全员C3证复审考试,安全生产模拟考试一点通上上海市安全员C3证作业手机同步练习。2023年【上海市安全员C3证】考试内容及上海…

XmlElement注解在Java的数组属性上,以产生多个相同的XML元素

例如&#xff0c;下面这段XML数据&#xff0c;有多个data元素&#xff0c;并且它们级别相同: <?xml version"1.0" encoding"UTF-8"?><request><reqtype>05</reqtype><secret>test</secret><body><userid&…

基于Vue+SpringBoot的考研专业课程管理系统

项目编号&#xff1a; S 035 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S035&#xff0c;文末获取源码。} 项目编号&#xff1a;S035&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高…

Deep Learning for Monocular Depth Estimation: A Review.基于深度学习的深度估计

传统的深度估计方法通常是使用双目相机&#xff0c;计算两个2D图像的视差&#xff0c;然后通过立体匹配和三角剖分得到深度图。然而&#xff0c;双目深度估计方法至少需要两个固定的摄像机&#xff0c;当场景的纹理较少或者没有纹理的时候&#xff0c;很难从图像中捕捉足够的特…

图像分类(四) 全面解读复现GoogleNet_InceptionV1-V4

论文解读 InceptionV1 前言 论文题目: Going Deeper with Convolutions Googlenet论文原文地址:https://arxiv.org/pdf/1409.4842.pdf 之前看过VGG的论文&#xff08;VGG精读直达&#xff09;。当时VGG获得了 2014 ILSVRC 图像分类的第二名&#xff0c;今天来看一下第一名…