我正在尝试使用Python连接到网址https://www.ssehl.co.uk/HALO/publicLogon.do
。
使用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响应,就像浏览器一样?
答案 0 :(得分:1)
出于某种原因,当您使用Python的内置内容(urllib2,requests,httplib)甚至命令行内容(curl,wget)而不是https时,服务器会出现错误并给出错误的响应。
但是,当您通过常规http请求页面时,它可以正常工作,例如:
import urllib2
print urllib2.urlopen('http://www.ssehl.co.uk/HALO/publicLogon.do').getcode()
打印出来
>> 200
我的猜测是他们的服务器配置错误,你的浏览器以某种方式静默地处理它。
答案 1 :(得分:0)
当我使用端口80
时,它对我有用。 SOOO:
port = 80;
使用 HTTPS 服务器认为Python时必定会出现一些错误...
此外,您发送错误的请求。您没有发送hostname
。
固定要求:
message = "GET /HALO/publicLogon.do HTTP/1.1\r\nHostname: %s\r\n\r\n"%host
所以 here 正在运行代码。
443
是加密的。并且Python不支持加密(可能)。答案 2 :(得分:0)
如果您需要支持https,则应使用 ssl.wrap_socket 。
有关详细信息,请参阅http://docs.python.org/2/library/ssl.html。