2016-07-24 8 views
0

Ich benutze Python 3.5.2 und scrapy 1.1.1.Python 3.5: "TypeError: memoryview: ein Byte-ähnliches Objekt wird benötigt, nicht 'str'"

Es ist ein Fehler, wenn Sie den Code unten ausgeführt wird:

#-*- 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'] 

Fehler:

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' 

ich denke, die Fehler zu diesem Satz zusammenhängt:

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

Aber ich don weiß nicht, wie ich es lösen kann.
Einige helfen bitte,
danke im voraus!

Edit:

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

geändert wurde

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

es ein anderer Fehler ist:

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

, was soll ich tun?

+0

Gerade FYI Base64-Codierung Das Passwort ist unsicher und macht in Bezug auf die Sicherheit ziemlich nichts. Sie sollten Salz-Hashing für einen sichereren Weg suchen; Schaut euch diese Frage an: http://stackoverflow.com/questions/9594125/salt-and-hash-a-password-in-python – Granitosaurus

+0

@Granitosaurus danke, ich werde es später versuchen. Jetzt gibt es einen anderen Fehler, siehe meine Bearbeitung ,Vielen Dank. – zwl1619

Antwort

1

Funktion base64.encodebytes() Bytes Wert erwartet und es scheint, wie Sie es sich um eine Zeichenfolge bereitstellen.

Um dies zu beheben, dass Sie einfach Ihren String-Wert kodieren können (encode() Funktion wird Ihr String-Objekt in Byte-Objekt):

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

oder in Ihrem Fall:

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

In Bezug auf Ihre Bearbeitung: Ihr Fehler bedeutet hier, dass ein Wert ist "String" der andere ist "Bytes" und wenn Sie versuchen, sie hinzuzufügen, wird Python ein bisschen verwirrt. Sie sollten entweder beide mit 'str.encode()' in Bytes umwandeln oder beide mit 'bytes.decode()' in einen String umwandeln. Sie können es einfach mit 'b'Basic '+ encoded_user_pass' in diesem speziellen Fall beheben. – Granitosaurus

1

Wie der Name schon sagt, codiert base64.encodebytesBytes, nicht Zeichenfolgen. Wie in der Dokumentation beschrieben, erfordert es eine bytes-like object (genau wie die Fehlermeldung auch sagt).

Ihr proxy['user_pass'] Wert ist jedoch eine Zeichenfolge. Damit in Bytes konvertieren, rufen str.encode:

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