You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Socket无法获取网页文本?请求返回400错误的解决办法

解决Socket编程中HTTP 400 Bad Request问题

你的代码出现400错误的核心原因是HTTP请求格式不符合协议规范,服务器无法解析你的请求。以下是具体问题和修正方案:

问题分析

  1. GET请求路径错误:当你已经通过Socket连接到目标服务器(data.pr4e.org)后,GET请求只需要指定相对路径(如/authors.txt),而不是完整的URL(http://data.pr4e.org/authors.txt)。
  2. 换行符不符合规范:HTTP协议要求请求头的换行必须使用\r\n(CRLF),而非单纯的\n,部分服务器对格式要求严格,不识别单一换行符。
  3. 缺少Host请求头:虽然HTTP 1.0未强制要求Host头,但现代服务器大多基于虚拟主机部署,需要该头来区分不同域名,缺失会导致解析失败。
  4. 遗漏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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:17:23