2017-07-11 11 views
0

私のコード: - :パイソン - ソケットエラー

b'HTTP/1.1 500 Domain Not Found\r\nServer: Varnish\r\nRetry-After: 0\r\ncontent-type: text/html\r\nCache-Control: private, no-cache\r\nconnection: keep-alive\r\nContent-Length: 179\r\nAccept-Ranges: bytes\r\nDate: Tue, 11 Jul 2017 15:23:55 GMT\r\nVia: 1.1 varnish\r\nConnection: close\r\n\r\n\n\n\nFastly error: unknown domain \n\n\nFastly error: unknown domain: . Please check that this domain has been added to a service.'

私はそれを修正するにはどうすればよい -

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     
s.connect(("www.python.org" , 80)) 
s.sendall(b"GET https://www.python.org HTTP/1.0\n\n") 
print(s.recv(4096)) 
s.close() 

出力が私にこのことを示してなぜ?

+1

'GETます。https:// www.python.org' - 私はあなたの代わりに "''/GET" したいと思います。 –

+0

@BrianCainは正しいです。 HTTP動詞の後に、アクセスするリソースへの相対パスを提供する必要があります。ドメインに接続することで、あなたはすでにwww.python.orgにアクセスしています。引き続き問題が発生する場合は、Host HTTP Headerを追加してください。 –

+0

これを行うと、プレーンテキストで表示されますか? –

答えて

4

これは、複数のレベルで間違っている:

  • あなたは(適切な証明書がなどをチェックして、既存のTCP接続の上すなわちssl_wrap)TLS接続を作成する必要がHTTPSリソースにアクセスしてから送信しますHTTPリクエスト。もちろん、この場合のTCP接続は、ポート443(https)ではなく80(http)に移動する必要があります。
  • HTTPリクエストはパスだけではなく、完全なURLが含まれている必要があり
  • ラインエンドでなければなりません\ rを\ N \ないのn
  • あなたはより良い多くの切断がそれを必要とするので、あまりにもHostヘッダを送信

これだけのリクエストです。適切に応答を処理することは別のトピックです。

リクエストのような既存のライブラリを使用することを本当にお勧めします。 HTTP(S)は、トラフィックのキャプチャをほんの少ししか見ていないと思うので、かなり複雑です。

+0

サンプルコードは何ですか? –

+0

リクエストはクイックスタートですhttp://docs.python-requests.org/ja/master/user/quickstart/#make-a-request – barny

+0

私は、生のソケットの代わりにリクエストライブラリを強くお勧めします。ハードな方法。 –

1
import requests 
x = requests.get('https://www.python.org') 
print x.text 

リクエストライブラリでは、HTTPSリクエストは非常に簡単です!生のソケットでこれをやっているなら、暗号などを交渉するためにもっと多くの作業をしなければなりません。上記のコード(Python 2.7)を試してみてください。

私の経験上、Pythonはすばやく作業するのに優れていることにも気付くでしょう。ネットワークと暗号化について学んでいるなら、ソケットを使ってあなた自身でHTTPSクライアントを書くことを試みてください。すばやく自動化したい場合は、使用可能なツールを使用してください。私はほとんどの場合、このタイプのタスクの要求を使用します。さらに注意すべき点として、HTMLコンテンツの解析に興味がある場合は、PyQueryライブラリを参照してください。私はこれを使って、多くのWebサービスとのやりとりを自動化しました。

Requests

PyQuery