【问题标题】:Python HTTP GET . "Wrong Request"Python HTTP 获取。 “错误的请求”
【发布时间】:2016-03-23 16:16:07
【问题描述】:

我正在尝试编写一个从用户输入的网站获取 html 代码的代码。我需要在不使用 urllib 或其他此类库的情况下编写此内容。

 from socket import *


url = (input("Please enter url: "))
host=gethostbyname(url)

clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((host,80))

clientSocket.send(("GET " + host + "HTTP/1.1\n\n").encode("UTF-8"))

file = clientSocket.recv(1024)
print("The html code: ", file.decode("UTF-8"))
clientSocket.close()

代码运行良好。但是,当我输入诸如“www.stackoverflow.com”之类的网站时,我会收到来自主机的“错误请求”响应:

The html code:  HTTP/1.1 400 Bad Request

Date: Wed, 23 Mar 2016 16:14:27 GMT

Content-Type: text/html

Content-Length: 177

Connection: close

Server: -nginx

CF-RAY: -



<html>

<head><title>400 Bad Request</title></head>

<body bgcolor="white">

<center><h1>400 Bad Request</h1></center>

<hr><center>cloudflare-nginx</center>

</body>

</html>

为了从服务器获取实际的 html 代码,正确的请求是什么。谢谢

【问题讨论】:

    标签: python html http get


    【解决方案1】:

    主机名不是 URL。由于您使用的是gethostbyname(),因此您的脚本似乎只提示输入主机名。 GET 请求期望看到其第一个参数的 URI。您还需要在换行符中发送回车,并且需要两个来终止 GET 请求。你应该是这样的:

    clientSocket.send(("GET / HTTP/1.1\r\n\r\n").encode("UTF-8"))
    

    此外,如果您只想下载一个 URL,请使用像 urllib2 这样的库,它会为您处理所有 HTTP 协议细节。例如:

    import urllib2
    
    r = urllib2.urlopen('http://google.com/')
    print r.read()
    

    【讨论】:

      【解决方案2】:

      你不是在说 HTTP/1.1,但你在第一行就这么说了。

      首先GET后面的token必须是服务器上的绝对路径;因此从/ 开始。

      其次,HTTP/1.1 请求必须包含Host: 标头。

      第三,您的简单客户端可能应该说Connection: close,因为它不处理分块连接。


      使用以下脚本可能会获得更好的成功:

      from socket import *
      
      host = gethostbyname('stackoverflow.com')
      clientSocket = socket(AF_INET, SOCK_STREAM)
      clientSocket.connect((host,80))
      clientSocket.send((
          "GET / HTTP/1.1\r\n"
          "Host: stackoverflow.com\r\n"
          "Connection: close\r\n\r\n").encode('utf-8'))
      
      file = clientSocket.recv(1024)
      print("The html code: ", file.decode("UTF-8"))
      clientSocket.close()
      

      【讨论】:

      • 谢谢!但是,我的教授要求用户输入网址,而不是我一开始就在那里。这就是我遇到问题的地方,因为不同的站点有不同的路径,我不知道如何概括它。
      • 然后使用urlparse将其解析为组件
      • 请原谅我的无知,但我不知道如何做到这一点。我只是介绍网络,我的教授不是很有帮助。到目前为止,我所做的一切都是通过自己的研究得到的,但我觉得自己遇到了障碍,因为我知道的不多。
      • 更新:我能够得到它。 '("GET / HTTP/1.1\r\n" "主机:"+ url +"\r\n" "连接:关闭\r\n\r\n")'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多