我刚开始使用Python 3.6.1中的Python Web数据。我正在学习套接字,我的代码出了问题,我无法弄明白。我的代码中的网站工作正常,但是当我运行此代码时,我收到400 Bad Request错误。我不确定我的代码有什么问题。提前谢谢。
import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))
mysock.send(('GET http://data.pr4e.org/romeo.txt HTTP/1.0 \n\n').encode())
while True:
data = mysock.recv(512)
if ( len(data) < 1 ):
break
print (data)
mysock.close()
答案 0 :(得分:3)
GET http://data.pr4e.org/romeo.txt HTTP/1.0 \n\n
欢迎来到HTTP的精彩世界,大多数用户认为这是一个简单的协议,因为它是人类可读的,但实际上它可能是一个非常复杂的协议。鉴于您的上述要求,有几个问题:
/romeo.txt
。只有在向代理发出请求时才会使用完整的URL。\r\n
而不是\n
。HTTP/1.0
之后应该没有空格。考虑到这一点,您发送的数据应该是
GET /romeo.txt HTTP/1.0\r\nHost: data.pr4e.org\r\n\r\n
我已经测试过它可以完美地适应这种修改。
但是,鉴于HTTP并不像它看起来那么简单,我真的建议使用像访问目标的请求这样的库。如果这看起来像是太多的开销,请研究HTTP standard以正确实现它,而不是仅仅猜测HTTP如何从一些示例中工作 - 并猜测它是错误的。
另请注意,服务器对于像您这样的破坏实施的宽容程度有所不同。因此,曾经使用过一台服务器的东西可能无法与下一台服务器配合使用,甚至在某些软件升级后也无法使用同一台服使用强大且经过良好测试和维护的库而不是自己完成所有操作可能会在以后为您节省大量麻烦。
答案 1 :(得分:1)
您不会将协议发送到Web服务器,只能在Host
标头中单独发送主机名,然后才会在HTTP 1.1中发送。
对于HTTP 1.0,它应该是:
mysock.send('GET /romeo.txt HTTP/1.0\r\n\r\n')
或者,您可以尝试发送HTTP 1.1请求:
mysock.send('GET /romeo.txt HTTP/1.1\r\n')
mysock.send('Host: data.pr4e.org\r\n\r\n')
答案 2 :(得分:1)
'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n'.encode()
适合我。
答案 3 :(得分:0)
此代码对我有用:
GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n
\n\n
更改为\r\n\r\n
HTTP/1.0
和\r\n\r\n
之间的空格