Socket无法获取网页文本?请求返回400错误的解决办法
解决Socket编程中HTTP 400 Bad Request问题
你的代码出现400错误的核心原因是HTTP请求格式不符合协议规范,服务器无法解析你的请求。以下是具体问题和修正方案:
问题分析
- GET请求路径错误:当你已经通过Socket连接到目标服务器(
data.pr4e.org)后,GET请求只需要指定相对路径(如/authors.txt),而不是完整的URL(http://data.pr4e.org/authors.txt)。 - 换行符不符合规范:HTTP协议要求请求头的换行必须使用
\r\n(CRLF),而非单纯的\n,部分服务器对格式要求严格,不识别单一换行符。 - 缺少Host请求头:虽然HTTP 1.0未强制要求Host头,但现代服务器大多基于虚拟主机部署,需要该头来区分不同域名,缺失会导致解析失败。
- 遗漏socket模块导入:原代码未导入
socket模块,运行时会直接报错,这是基础疏漏。
修正后的代码
import socket msock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) msock.connect(('data.pr4e.org', 80)) # 修正请求格式:相对路径、CRLF换行、添加Host头 cmd = 'GET /authors.txt HTTP/1.0\r\nHost: data.pr4e.org\r\n\r\n'.encode() msock.send(cmd) while True: dat = msock.recv(512) if len(dat) < 1: break print(dat.decode(), end='') # 避免默认换行导致输出格式混乱 msock.close()
关键修正点说明
- 补充
import socket:确保代码能正常调用socket相关API。 - 替换请求路径为相对路径:让服务器明确你要访问的资源位置。
- 使用
\r\n作为换行符:严格遵循HTTP协议规范,避免服务器解析失败。 - 添加
Host头:适配虚拟主机部署的服务器,确保请求被正确路由。
你更换其他网站后仍报错,是因为所有合规的HTTP服务器都会遵循相同的请求规范,你的原请求格式错误是共性问题,修正后即可正常获取目标文件内容。
内容的提问来源于stack exchange,提问作者pythonnoob4567
相关产品推荐
相关产品推荐

