使用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 🎓💡🎯