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

Python Socket发送GET请求返回400错误,求排查及单词计数建议

解决HTTP 400错误及单词计数实现建议

咱们先逐个拆解导致你收到400 Bad Request的代码问题,再聊聊单词计数的实现思路:

代码中的错误点

  • 请求行格式错误:你写的GET / tests/a.html HTTP/1.1里,路径部分多了个空格,服务器会把这种带空格的路径识别成无效请求,正确格式应该是GET /tests/a.html HTTP/1.1。
  • HTTP头字段拼写错误:Conncection少了一个字母e,正确的字段名是Connection——HTTP头字段名大小写不敏感,但拼写必须准确,错误的字段名会让服务器无法正常解析请求。
  • If-Modified-Since字段值无效:这个字段需要传入符合HTTP标准的日期格式(比如Sat, 08 Feb 2020 20:53:36 GMT),你填的<>是空值,服务器完全无法识别。如果是首次请求,你可以先发送不带该字段的请求,拿到响应头里的Last-Modified值后再复用。
  • HTTP请求格式不规范:HTTP协议要求每一行的结束必须是\r\n,且请求头结束后必须额外加一个空行(即\r\n\r\n)来告知服务器请求头已结束。你用的是普通换行符,还缺少结尾空行,这会导致服务器解析请求失败。

修正后的代码示例

import socket,sys

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('162.246.156.195', 80)
client_socket.connect(server_address)

# 先发送不带If-Modified-Since的请求,获取Last-Modified值
request = '''GET /tests/a.html HTTP/1.1
Host: 162.246.156.195
Connection: close

'''
client_socket.send(request.encode())
response = client_socket.recv(4096).decode()
client_socket.close()

# 解析响应头中的Last-Modified值
last_modified = None
for line in response.split('\r\n'):
    if line.lower().startswith('last-modified:'):
        last_modified = line.split(':', 1)[1].strip()
        break

# 若成功获取到Last-Modified,再发送带条件的请求
if last_modified:
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(server_address)
    mod_request = f'''GET /tests/a.html HTTP/1.1
Host: 162.246.156.195
If-Modified-Since: {last_modified}
Connection: close

'''
    client_socket.send(mod_request.encode())
    mod_response = client_socket.recv(4096).decode()
    print("带If-Modified-Since的响应:")
    print(mod_response)
    client_socket.close()
else:
    print("未从响应中获取到Last-Modified值")

单词计数的实现建议

当你成功获取到页面内容后,可以按以下步骤统计指定单词的出现次数:

  1. 分离响应头与响应体:HTTP响应中,响应头和响应体用\r\n\r\n分隔,用response.split('\r\n\r\n', 1)拆分后,第二个元素就是页面的文本内容。
  2. 预处理文本:把文本转成小写(避免大小写敏感的统计误差),去掉标点符号(可以用str.translate()结合string.punctuation来实现)。
  3. 拆分并统计单词:将处理后的文本按空格拆分,然后遍历单词列表统计目标单词的出现次数。

示例代码片段(以统计单词"test"为例):

# 假设已拿到完整的response响应内容
header, body = response.split('\r\n\r\n', 1)
# 预处理:移除标点并转小写
import string
translator = str.maketrans('', '', string.punctuation)
clean_body = body.lower().translate(translator)
# 拆分单词并统计目标单词
target_word = "test"
count = 0
for word in clean_body.split():
    if word == target_word:
        count += 1
print(f"单词'{target_word}'共出现了{count}次")

内容的提问来源于stack exchange,提问作者fulcrum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:07:38