首页 > 解决方案 > 如何在 python 3.6 上制作一个简单的网络浏览器?

问题描述

到目前为止,这就是我所拥有的,我看过的每个地方都说这段代码应该可以工作,但它没有。

import socket

mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('data.pr4e.org', 80))
mysock.send(b'GET http://data.pr4e.org/romeo.txt HTTP/1.0\n\n')

while True:
    data = mysock.recv(512)
    if ( len(data) < 1 ) :
        break
    print (data)

mysock.close()

这是我得到的输出:

b'HTTP/1.1 400 Bad Request\r\nDate: Sun, 25 Nov 2018 19:23:51 GMT\r\nServer: 
Apache/2.4.18 (Ubuntu)\r\nContent-Length: 308\r\nConnection: 
close\r\nContent-Type: text/html; charset=iso-8859-1\r\n\r\n<!DOCTYPE HTML 
PUBLIC "-//IETF//DTD HTML 2.0//EN">\n<html><head>\n<title>400 Bad 
Request</title>\n</head><body>\n<h1>Bad Request</h1>\n<p>Your browser sent a 
request that this server could not understand.<br 
/>\n</p>\n<hr>\n<address>Apache/2.4.18 (Ubuntu) Server at do1.dr-chuck.com 
Port 80</address>\n</body></html>\n'

这就是示例所说的我应该回来的内容:

HTTP/1.1 200 OK
Date: Sun, 14 Mar 2010 23:52:41 GMT
Server: Apache
Last-Modified: Tue, 29 Dec 2009 01:31:22 GMT
ETag: "143c1b33-a7-4b395bea"
Accept-Ranges: bytes
Content-Length: 167
Connection: close
Content-Type: text/plain
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief

为什么我没有得到相同的输出?

标签: pythonpython-3.xpython-webbrowser

解决方案


从某种意义上说,您的代码可以正常工作,因为它可以成功地向服务器发送请求,并且您确实得到了有效的结果。您可以看到错误消息本身来自服务器

但是你没有得到预期的结果,所以这确实是一个问题。在浏览器中直接打开http://data.pr4e.org/romeo.txt可以正常工作,所以让我们进一步看一下,例如400 error header with sockets之类的问题,它们处理的问题几乎相同。

经过一些试验,似乎该 Web 服务器需要Microsoft Windows 样式的行尾:两者\r \n. 就像\n你的尝试一样,只是一个 ' 不起作用 - 你会得到那个错误。只是一个\r使服务器无限期地等待(或者说“相当长的时间,而且肯定比我准备等待这个实验的时间更长”)。

所以这个简单的修改使您的原始程序工作:

mysock.send(b'GET http://data.pr4e.org/romeo.txt HTTP/1.0\r\n\r\n')

并在几个标题之后返回这首诗:

... But soft what bytes through yonder port breaks
It is a request and Http is the Sun ...

(诚​​然,稍微转述)

在某些操作系统(Microsoft Windows 是我所知道的唯一操作系统)上,行尾的标准代码\n自动扩展为\r\n. 因此可以合理地假设您的工作示例代码是在 Windows 机器上编写和测试的,并且其编写者从不知道(或关心)这种显式类型的行结束符是 Apache 服务器所期望的。


推荐阅读