python 3.5:“TypeError:memoryview:需要一个类似字节的对象,而不是'str'”

时间:2016-07-24 15:31:29

标签: python-3.x scrapy

我正在使用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

我该怎么办?

2 个答案:

答案 0 :(得分:2)

函数base64.encodebytes()期望字节值,看起来你正在为它提供一个字符串。

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

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

或在你的情况下:

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

答案 1 :(得分:1)

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

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

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