2017-05-23 23 views
0

我开始学习python。我正在尝试这本书中的这段代码。使用python socket获取每个页面的404错误

import socket 

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

try: 
    mysock.connect(('www.py4inf.com', 80)) 
    mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n') 

except Exception as e: 
    print(e) 


try: 
    while True: 
     data = mysock.recv(512) 
     if (len(data) < 1) : 
      break 
     print data 
except Exception as e: 
    print(e) 

mysock.close() 

不管我试图连接哪个网页,我得到404错误。 当我运行代码时,我得到了以下内容。

HTTP/1.1 404 Not Found 
Server: nginx 
Date: Tue, 23 May 2017 17:54:54 GMT 
Content-Type: text/html 
Content-Length: 162 
Connection: close 

<html> 
<head><title>404 Not Found</title></head> 
<body bgcolor="white"> 
<center><h1>404 Not Found</h1></center> 
<hr><center>nginx</center> 
</body> 
</html> 
+0

尝试使用GET /code/romeo.txt HTTP/1.0 \ n主机:www.py4inf.com \ n \ n' –

+0

它工作!谢谢 – jineps

回答

1
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n') 

您正试图发送一个HTTP请求,但也有许多东西错。其中的一些原因问题,而其他人只是得到由该特定服务器忽略:

  • 线到底应该\r\n\n
  • 在GET请求中的路径不应是绝对URL,但相对于服务器,即/code/romeo.txt。 HTTP/1.1可接受绝对值,但使用HTTP/1.0。
  • 服务器使用虚拟主机,即同一IP地址上的多个主机名。因此,您必须指定使用Host标题访问哪个主机。

最后一项实际上是本例中最重要的一项,但其他项目也应该修正。因此到达正确的请求是这样的

mysock.send('GET /code/romeo.txt HTTP/1.0\r\nHost: www.py4inf.com\r\n\r\n') 

更多信息请研究HTTP标准,即RFC 1945为更简单的HTTP/1.0和RFC 2616为HTTP/1.1这是更复杂的,但在实践中更加常用。

+0

这工作。谢谢 – jineps