2017-05-31 13 views
2

EDIT - FIXED tldr、半古いバージョンのpythonがインストールされました。数年前、新しいSSL証明書を処理するために更新されなかったsslパッケージがありました。 Pythonを更新し、sslパッケージが最新のものであることを確認した後、すべてがうまくいった。Pythonリクエストが特定のサイトでSSLエラーをスローする


私は、Webスクレイピングに新たなんだ、と特定のサイトをこすりしたかったが、この特定のサイト上でPythonの要求のパッケージを使用する際に、何らかの理由で私はエラーを取得しています。

私は自分のユーザープロフィールからデータをスクラップするために安全なログインに取り組んでいます。ログインアドレスはここにあります:https://secure.funorb.com/m=weblogin/loginform.ws?mod=hiscore_fo&ssl=0&expired=0&dest=

私はちょうどこの時点でget要求からテキストを印刷するような単純なタスクを実行しようとしています。以下は私のコードです。私はこれを実行すると

import requests 

req = requests.get('https://secure.funorb.com/m=weblogin/loginform.ws?mod=hiscore_fo&ssl=0&expired=0&dest=',verify=False) 
print req.text 

、エラーがスローされます。

File "/Library/Python/2.7/site-packages/requests/adapters.py", line 512, in send 
    raise SSLError(e, request=request) 
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:590) 

私は何が起こっているのかを確認するには、このファイルで見てきました。犯人は私がここに私のデバッグ限界で一種のだけど、残念ながらこれを回避する方法は本当にわからないんだけど

except (_SSLError, _HTTPError) as e: 
     if isinstance(e, _SSLError): 
      raise SSLError(e, request=request) 
     elif isinstance(e, ReadTimeoutError): 
      raise ReadTimeout(e, request=request) 
     else: 
      raise 

あるようです。

私のコードは、https://bitbucket.org/account/signin/のような他の安全なサイトで正常に動作します。私は、スタック交換とネットの周りのソリューションのトンを見てきました。多くの人々はオプションの引数 "verify = False"でこれらのタイプのSSLエラーを修正する必要があると主張しました(これは最も安全な方法ではありませんそれ)。しかし、私のコードスニペットからわかるように、これは私を助けるものではありません。

誰でもこの作業をすることができます/どこに行くかアドバイスをいただければ幸いです。

答えて

2

...多くの人が「= Falseを確認する」オプションの引数に追加することがverify=Falseを追加するSSLエラー

これらのタイプを修正する必要があります主張した証明書を検証する際のエラーに対して役立ちますが、ないEOFに対するサーバーから、ハンドシェイクエラーまたは同様のもの。

SSLLabsからわかるように、この特定のサーバーは、現代の暗号でTLS 1.2をサポートしていないクライアントの接続を閉じる(つまり、プロトコル違反でEOFが発生した)という現象を示しています。使用するSSLバージョンを指定していないが、OpenSSL 1.0.1よりも小さいバージョンであると期待しています.TLS 1.2をサポートするOpenSSLの最初のバージョンです。

コードで使用されているバージョンはssl.OPENSSL_VERSIONです。私が正しいのであれば、唯一の修正はOpenSSLのバージョンをPythonでアップグレードすることです。これがどのように行われるかはプラットフォームによって異なりますが、Updating openssl in python 2.7のような既存の投稿があります。

+0

ありがとうございました。 – spaderdabomb

+0

これは良いキャッチです! – Alfabravo

1

他の場所で見ました。あなたが要求して作業を続けたい場合は、多分あなたはndg-httpsclientパッケージをインストールする必要がありますsess.get()

requests.get()を変更、その後

import requests 
sess = requests.Session() 
adapter = requests.adapters.HTTPAdapter(max_retries = 20) 
sess.mount('http://', adapter) 

:あなたはこのようなsessionsを使用してみてください。

+0

あなたのスニペットはうまく動作しますが、sess.get(URL)部分を追加すると、同じエラーが発生します – spaderdabomb

関連する問題