【问题标题】:python 3.5 : "TypeError: memoryview: a bytes-like object is required, not 'str'"python 3.5:“TypeError:memoryview:需要一个类似字节的对象,而不是'str'”
【发布时间】:2016-11-27 23:11:43
【问题描述】:

我正在使用 python 3.5.2 和 scrapy 1.1.1

运行以下代码时出现错误:

#-*- coding:utf-8-*-

import random
import base64


class ProxyMiddleware(object):
    def process_request(self, request, spider):
        proxy = random.choice(PROXIES)
        if proxy['user_pass'] is not None:
            request.meta['proxy'] = "http://%s" % proxy['ip_port']
            encoded_user_pass = base64.encodebytes(proxy['user_pass'])
            request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
            print("ok!" + proxy['ip_port'])
        else:
            print("fail!" + proxy['ip_port'])
            request.meta['proxy'] = "http://%s" % proxy['ip_port']

错误:

  File "C:\Users\dell\AppData\Local\Programs\Python\Python35\lib\base64.py", line 518, in _input_type_check
    m = memoryview(s)
    TypeError: memoryview: a bytes-like object is required, not 'str'

我认为错误与这句话有关:

encoded_user_pass = base64.encodebytes(proxy['user_pass'])

但我不知道如何解决。
请帮忙,
提前致谢!

编辑:

encoded_user_pass = base64.encodebytes(proxy['user_pass'])

改为

encoded_user_pass = base64.encodebytes(proxy['user_pass'].encode())

还有一个错误:

    request.headers['Proxy-Authorization'] = 'Basic ' + encoded_user_pass
TypeError: Can't convert 'bytes' object to str implicitly

我该怎么办?

【问题讨论】:

  • 仅供参考 base64 对密码进行编码是不安全的,并且在安全性方面几乎没有任何作用。您应该研究盐散列以获得更安全的方法;看看这个问题:stackoverflow.com/questions/9594125/…
  • @Granitosaurus 谢谢,我稍后再试。现在还有另一个错误,请参阅我的编辑,谢谢。

标签: python-3.x scrapy


【解决方案1】:

顾名思义,base64.encodebytes 编码 字节,而不是字符串。如文档中所述,它需要bytes-like object(就像错误消息告诉您的那样)。

但是,您的 proxy['user_pass'] 值是一个字符串。要将其转换为字节,请调用 str.encode:

encoded_user_pass = base64.encodebytes(proxy['user_pass'].encode())

【讨论】:

    【解决方案2】:

    函数base64.encodebytes() 需要字节值,并且您似乎正在为其提供一个字符串。

    要解决这个问题,您可以简单地对字符串值进行编码(encode() 函数将您的字符串对象转换为字节对象):

    base64.encodebytes('foo'.encode())
    

    或者在你的情况下:

    encoded_user_pass = base64.encodebytes(proxy['user_pass'].encode())
    

    【讨论】:

    • 关于您的编辑:您的错误意味着一个值是string,另一个是bytes,当您尝试添加它们时,python 会有点困惑。您应该使用str.encode() 将两者都转换为字节,或者使用bytes.decode() 将两者都转换为字符串。在这种特定情况下,您可以使用b'Basic' + encoded_user_pass 修复它。
    猜你喜欢
    • 1970-01-01
    • 2019-01-27
    • 2021-10-30
    • 2018-06-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多