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值")
单词计数的实现建议
当你成功获取到页面内容后,可以按以下步骤统计指定单词的出现次数:
- 分离响应头与响应体:HTTP响应中,响应头和响应体用
\r\n\r\n分隔,用response.split('\r\n\r\n', 1)拆分后,第二个元素就是页面的文本内容。 - 预处理文本:把文本转成小写(避免大小写敏感的统计误差),去掉标点符号(可以用
str.translate()结合string.punctuation来实现)。 - 拆分并统计单词:将处理后的文本按空格拆分,然后遍历单词列表统计目标单词的出现次数。
示例代码片段(以统计单词"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
相关产品推荐
相关产品推荐

