关于TypeError: decode() argument ‘encoding‘ must be str, not None 的三种解决方法

使用Scrapy-Redis时,有一个常见的错误可能会让你烦恼不已:TypeError: decode() argument ‘encoding’ must be str, not None 🤔

这是因为Scrapy-Redis在从Redis队列中读取请求数据时,数据是字节类型的,但Scrapy的请求需要字符串类型的URL 😔

解决方法:

不用担心,这个问题可以轻松解决!我们只需要重写Scrapy-Redis提供的make_request_from_data()方法,并将字节类型的数据解码为字符串即可 💪


from scrapy import Request

class MyRedisSpider(RedisSpider):
    name = 'my_redis_spider'

    def make_request_from_data(self, data):
        url = data.decode()  # 将字节类型的数据解码为字符串
        return Request(url, callback=self.parse)  # 使用解码后的URL创建请求并指定回调函数

这样,TypeError: decode() argument ‘encoding’ must be str, not None的错误就解决了!接下来,你就可以愉快地使用Scrapy-Redis了 🎉

其他方法:

除了使用make_request_from_data()方法以外,还有其他一些方法可以解决这个错误。

1、例如,您可以在存储请求数据时将其转换为字符串类型,而不是字节类型。这样,当Scrapy-Redis提取数据时,它就不需要解码。

import redis

r = redis.Redis(host='localhost', port=6379, db=0)
r.lpush('my_redis_spider:start_urls', 'https://www.example.com')

2、此外,您还可以更改Scrapy-Redis的配置,以在读取请求数据时将其解码为字符串。为此,您可以在settings.py中添加以下行:

REDIS_PARAMS = {'decode_responses': True}

这样,Scrapy-Redis就会自动将读取的数据解码为字符串,而您不需要在代码中执行任何操作。

总之,解决TypeError: decode() argument ‘encoding’ must be str, not None的错误有多种方法,您可以根据自己的需要选择最适合的解决方案。请不要灰心,因为总有解决方法! 😃

补充:

在scrapy-redis中,make_request_from_data方法用于从Redis中获取的数据(通常是URL)创建一个Scrapy请求。默认情况下,该方法接收一个编码后的URL(字节类型),然后使用make_requests_from_url()方法创建一个新的请求实例。

make_request_from_data源码:

	    def make_request_from_data(self, data):
        """Returns a Request instance from data coming from Redis.

        By default, ``data`` is an encoded URL. You can override this method to
        provide your own message decoding.

        Parameters
        ----------
        data : bytes
            Message from redis.

        """
        url = bytes_to_str(data, self.redis_encoding)
        return self.make_requests_from_url(url)

🚀💻 欢迎一起探索编程世界的更多精彩博客!🌟
🔗1️⃣ 从入门到精通:掌握Python核心知识,解锁编程新世界!
🔗2️⃣ Python3.11,新特性亮点满满,让你的编程之路更加轻松!
🔗3️⃣ 8个Python编程技巧,让你的代码速度飞起,老板刮目相看!
🔗4️⃣ Pandas 日期处理:生成及去除工作日与节假日
🔗5️⃣ Python音频处理——pydub
🔗6️⃣Python使用XPath解析HTML:从入门到精通
🔗7️⃣Python天文数据处理——Astropy

一起来学习吧!😄🎉 #编程 #CSDN #Python #Pandas #Astropy 🎓💡🎯

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄昏中起飞的猫头鹰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值