Python - 套接字错误

时间:2017-07-11 15:34:55

标签: python sockets

我的代码: -

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()

为什么输出会显示我: -

  

b'HTTP / 1.1 500未找到域\ r \ n服务器:Varnish \ r \ nRetry-After:0 \ r \ ncontent-type:text / html \ r \ nCache-Control:private,no-cache \ r \ n \ nconnection:keep-alive \ r \ nContent-Length:179 \ r \ nAccept-Ranges:bytes \ r \ n日期:星期二,2017年7月11日15:23:55 GMT \ r \ nVia:1.1 varnish \ r \ n \ nConnection:关闭\ r \ n \ r \ n \ n \ n \ n最大错误:未知域\ n \ n \ n最大错误:未知域:。请检查此域名是否已添加到服务中。'

我该如何解决?

2 个答案:

答案 0 :(得分:4)

这在多个级别上都是错误的:

  • 访问创建TLS连接所需的HTTPS资源(即在现有TCP连接之上的ssl_wrap,具有适当的证书检查等),然后发送HTTP请求。当然,在这种情况下,TCP连接应该转到端口443(https)而不是80(http)。
  • HTTP请求应该只包含路径,而不是完整的URL
  • 行结尾必须是\ r \ n而不是\ n
  • 你最好发送一个主机头,因为许多服务器需要它

那只是请求。正确处理响应是一个不同的主题。

我真的建议使用像请求这样的现有库。 HTTP(S)要复杂得多,因为大多数人认为只看一些流量捕获。

答案 1 :(得分:1)

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

使用请求库,HTTPS请求非常简单!如果您使用原始套接字执行此操作,则必须执行更多工作来协商密码等。尝试上面的代码(python 2.7)。

我还要注意,根据我的经验,Python非常适合快速做事。如果您正在学习网络和加密,请尝试使用套接字自己编写HTTPS客户端。如果要快速自动化某些内容,请使用可用的工具。我几乎总是使用这种任务的请求。另外请注意,如果您对解析HTML内容感兴趣,请查看PyQuery库。我已经用它来自动化与许多Web服务的交互。

Requests

PyQuery