首页 > 编程语言 >Python下使用requests库遇到的问题及解决方案

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

时间:2023-11-21 13:33:00浏览次数:42  
标签:__ Python 解决方案 local NoLocalAuth requests pickle

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

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

一、问题背景

在最近的项目中,我使用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、导入必要的库和模块:

import requests
from requests.auth import HTTPDigestAuth

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

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序列化:

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实时切换地址防止网站跳验证码。如果有更多的代码问题可以一起交流。

标签:__,Python,解决方案,local,NoLocalAuth,requests,pickle
From: https://blog.51cto.com/u_13488918/8500665

相关文章

  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-31-JavaScript的调用执行-上篇
    1.简介在做web自动化时,有些情况playwright的api无法完成以及无法应对,需要通过或者借助第三方手段比如js来完成实现,比如:去改变某些元素对象的属性或者进行一些特殊的操作,本文讲解playwright怎样来调用JavaScript完成特殊操作。2.用法上一篇中就提到过,这里提取一下,语法如下:......
  • Python深入分享之闭包
    闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式(而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性......
  • Linux环境下Python3.10安装
    事件缘起我在Linux服务器(CentOS7.8)安装Python3.10,并替换python软链接为python3之后,yum命令不可用。特此记录一下。完整安装步骤如下:Python3.10安装1.使用yum程序提前安装Python依赖。yuminstallwgetzlib-develbzip2-developenssl-develncurses-develsqlite-devel......
  • python区分大小写吗
    当涉及Python语言时,它是区分大小写的。这意味着在Python编程中,标识符、变量名、函数名以及关键字是区分大小写的。标识符和变量名在Python中,标识符是用来标识变量、函数、类或其他对象的名称。Python对标识符和变量名是严格区分大小写的。例如,myVar和myvar被视为两个不同的变量......
  • Java开发者的Python快速进修指南:异常捕获
    在之前的学习中,我们已经讲解了函数和控制流等基本概念。然而,在接触实际业务时,你会发现异常捕获也是必不可少的一部分,因为在Java编程中,异常处理是不可或缺的。Python的异常捕获与Java的异常捕获原理是相同的,只是在写法上有一些区别。它们的目的都是为了处理程序在执行过程中出现错......
  • 2023年第 17期《Python接口自动化+Playwright 》课程,12月3号开学(课程全面升级!)!
    2023年第17期《Python接口自动化+Playwright》课程课程,12月3号开学(课程全面升级!)主讲老师:上海-悠悠上课方式:微信群视频在线教学,方便交流本期上课时间:2023年12月3号-2024年3月2号,晚上20:30-22:30报名费:报名费3000一人(周期3个月)联系微信/QQ:283340479课表如下直播课程主要......
  • 启动ASP.NET项目报“/”应用程序中的服务器错误,解决方案
    当使用浏览器启动aspx项目时,如果浏览器出现下面错误  需要检查系统服务中的ASP.NETStateService服务是否启动 如果没有启动,会报这种错误,及时启动起来,就可以解决......
  • Centos7编译安装Python
    Centos7编译安装Python环境准备操作系统:Centos7版本:Python3.12下载wgethttps://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz编译安装#安装依赖yum-yinstallgcczlibzlib-devellibffilibffi-develreadline-developenssl-developenssl11openssl......
  • Python学习笔记-Schema数据结构及类型校验
    Python学习笔记-Schema数据结构及类型校验使用schema库来执行数据结构的校验。schema是一个简单而强大的库,用于定义和验证Python数据结构的约束AndAnd代表必选,数据结构里必须包含这个schema,如下方声明了name,则代表这个name必须存在与字典中fromschemaimportSc......
  • Python中的UnboundLocalError是什么错误?如何解决?
    在一个月黑风高的夜晚,我们满心欢喜地写出以下代码:money=10000#当前的财产,单位为元defadd_money(value):money+=valueprint('当前财产:',money)add_money(10)print('当前财产:',money)以上代码中,定义了函数add_money,将money增加value.我们期待着运行......