2016-07-24 3 views
0

私はPython 3.5.2とscrap 1.1.1を使用しています。以下のコードを実行中にエラーがありますpython 3.5: "TypeError:memoryview: 'str'ではなく、バイトのようなオブジェクトが必要です"

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

エラー:

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

しかし、私はドン:

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' 

私はエラーがこの文に関連していると思いますそれを解決する方法は分かりません。
ご協力ありがとうございます。
ありがとうございます!

編集:

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

私は何をすべき:

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

は別のエラーがある

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

に変更されましたか?

+0

だけFYIにbase64エンコード:

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

のか、あなたのケースでパスワードは安全ではなく、セキュリティに関してはほとんど何もしません。より安全な方法で実行するには、ソルトハッシュを調べる必要があります。この質問をチェックアウト:http://stackoverflow.com/questions/9594125/salt-and-hash-a-password-in-python – Granitosaurus

+0

@Granitosaurusありがとう、私は後でそれを試してみましょう。もう一つのエラーがあります、私の編集を参照してください、ありがとう。 – zwl1619

答えて

1

関数は値をバイト、あなたはそれの文字列を提供しているように思えます。

あなたは単にあなたの文字列値をエンコードすることができることを修正するには(エンコード()関数は、バイトオブジェクトにあなたの文字列オブジェクトをオン):

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

あなたの編集について:ここでのエラーは、一方の値が 'string'で他方が' bytes'であることを意味し、それらを追加しようとすると少し混乱します。両方を 'str.encode()'でバイトに変換するか、両方とも 'bytes.decode()'で文字列に変換する必要があります。この場合、 'b'Basic '+ encoded_user_pass'で修正することができます。 – Granitosaurus

1

名前が示すように、base64.encodebytesバイトであり、文字列ではありません。ドキュメントに記載されているように、エラーメッセージにも同様にbytes-like objectが必要です。

proxy['user_pass']の値は文字列です。バイトにそれを変換するために、str.encodeを呼び出す:base64.encodebytes()が期待している

encoded_user_pass = base64.encodebytes(proxy['user_pass'].encode()) 
関連する問題