我已经检查了有关我的问题的答案,但我找不到有什么问题。我是Python的新手,这可能是个问题。我已经编写了这个简单的代码来连接到一个站点,但是我收到了这个错误:
socket.gaierror: [Errno 11004] getaddrinfo failed
这是我的代码:
import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('http://www.py4e.com', 80))
mysock.send('GET http://www.py4e.com/code3/mbox-short.txt HTTP/1.0\n\n')
while True:
data = mysock.recv(512)
if(len(data) < 1):
break
print (data)
mysock.close()
答案 0 :(得分:1)
import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4e.com', 80))
mysock.send('GET http://www.py4e.com/code3/mbox-short.txt HTTP/1.0\n\n')
while True:
data = mysock.recv(512)
if(len(data) < 1):
break
print (data)
mysock.close()
非常简单,请勿在{{1}}的主持人声明中使用http://
.connect()
是协议,http://
是主机(或DNS服务器中的A记录)。标准套接字库对协议一无所知,只需主机和端口编号。
如果您想要自动化流程,请使用urllib.request检查Requests或@ Mego的答案,https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Client_request为您处理连接和HTTP解析。
此外,如果您使用的是www.py4e.com
,那么您需要在执行Python3
时发送bytes
个数据。
将字符串转换为.send()
数据的方法有两种:
bytes
两者基本上都是一样的。
最后,在mysock.send(b'GET http://www.py4e.com/code3/mbox-short.txt HTTP/1.0\n\n')
mysock.send(bytes('GET http://www.py4e.com/code3/mbox-short.txt HTTP/1.0\n\n', 'UTF-8'))
请求中,您也不会请求GET
相反,您只需将路径发送到要检索的文件:
http://
原因是(再次)mysock.send(b'GET /code3/mbox-short.txt HTTP/1.0\n\n')
是协议描述符,而不是正在发送的实际协议数据的一部分。您在http://
请求中也不需要主机声明,因为您连接到的服务器已经知道您所在的主机 - 因为您已...连接到它。
相反,如果主机为多个虚拟主机提供服务,则服务器希望您提供GET
标头
您可能需要一些其他标题才能从某些Web服务器请求实际内容。
但这是事情的基本要点。
这是一个好的开始:
它会向您显示原始Host: <hostname>\r\n
请求的内容
在将来,我建议使用内置的{{3}}浏览器,它可以显示原始标题,原始响应和一大堆其他内容。
答案 1 :(得分:-2)
我强烈建议您使用Requests module而不是直接处理套接字。
要安装Requests,只需在shell中运行以下命令(在Linux系统上需要sudo
):
pip install requests
然后,您的代码就像:
一样简单import requests
req = requests.get('http://www.py4e.com/code3/mbox-short.txt')
data = r.text
print(data)