3

https://www.ssehl.co.uk/HALO/publicLogon.doPythonで URL に接続しようとしています。

を使用した簡単なソリューションrequestsは失敗します。

import requests
r = requests.get('https://www.ssehl.co.uk/HALO/publicLogon.do')
print r.text

エラーあり

File "c:\Python27\lib\site-packages\requests\adapters.py", line 327, in send
raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='www.ssehl.co.uk', port=443): Max retries exceeded with url: /HALO/publicLogon.do (Caused by <class 'httplib.BadStatusLine'>: '')

だから私はライブラリを使用してサーバーから生の応答を取得しようとしましたsocket:

import socket   #for sockets
import sys  #for exit

#create an INET, STREAMing socket
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
    print 'Failed to create socket'
    sys.exit()

print 'Socket Created'
host = 'www.ssehl.co.uk';
port = 443;

try:
    remote_ip = socket.gethostbyname(host)

except socket.gaierror:
    #could not resolve
    print 'Hostname could not be resolved. Exiting'
    sys.exit()

#Connect to remote server
s.connect((remote_ip , port))

print 'Socket Connected to ' + host + ' on ip ' + remote_ip

#Send some data to remote server
message = "GET /HALO/publicLogon.do HTTP/1.1\r\n\r\n"

try :
   #Set the whole string
   s.sendall(message)
except socket.error:
   #Send failed
   print 'Send failed'
   sys.exit()

print 'Message send successfully'

#Now receive data
reply = s.recv(4096)

print reply

出力します:

Socket Created
Socket Connected to www.ssehl.co.uk on ip 161.12.7.194
Message send successfully
Reply: 

返信後、貼り付けられないゴミがありますが、これは崇高なコンソールのスクリーンショットです:

スクリーンショット

ブラウザと同じように、サーバーから 200 応答を取得する方法はありますか?

4

3 に答える 3

1

何らかの理由で、Python の組み込みのもの (urllib2、要求、httplib) またはコマンド ラインのもの (curl、wget) を https 経由で使用すると、サーバーがスパッツアウトして誤った応答を返します。

ただし、通常の http 経由でページをリクエストすると、次のように正常に動作します。

import urllib2
print urllib2.urlopen('http://www.ssehl.co.uk/HALO/publicLogon.do').getcode()

プリントアウト

>> 200

私の推測では、彼らのサーバーの設定が間違っていて、ブラウザが黙って処理していると思われます。

于 2013-10-16T11:13:34.530 に答える
0

https をサポートする場合は、 ssl.wrap_socketを使用する必要があります。

詳細については、 http://docs.python.org/2/library/ssl.htmlを参照してください。

于 2013-10-17T12:55:37.653 に答える
0

port を使用するとうまくいきました80。Sooo: Python と考えてHTTPSサーバー port = 80;

を使用すると、何らかのエラーが発生するはずです... また、間違ったリクエストを送信しています。を送信していません。固定リクエスト:
hostname

message = "GET /HALO/publicLogon.do HTTP/1.1\r\nHostname: %s\r\n\r\n"%host


ここに作業コードがあります


443ポートが暗号化されているため、問題があると思います。また、Python は暗号化をサポートしていません (おそらく)。

于 2013-10-17T09:46:02.440 に答える