Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 400带套接字的错误标头_Python_Sockets - Fatal编程技术网

Python 400带套接字的错误标头

Python 400带套接字的错误标头,python,sockets,Python,Sockets,我正在创建一个论坛状态抓取器。但我想使用套接字从论坛获取数据。因此,我正在向套接字写入一个头。但是有400个错误。所以我做了一个测试脚本来进行检查,但仍然会出现错误 import socket s = socket.socket() s.connect(("198.57.47.136", 80)) header = """ GET / HTTP/1.1\r\n Host: httn Connection: keep-alive\r\n Cache-Control: max-age=0\r\n A

我正在创建一个论坛状态抓取器。但我想使用套接字从论坛获取数据。因此,我正在向套接字写入一个头。但是有400个错误。所以我做了一个测试脚本来进行检查,但仍然会出现错误

import socket
s = socket.socket()
s.connect(("198.57.47.136", 80))
header = """
GET / HTTP/1.1\r\n
Host: httn
Connection: keep-alive\r\n
Cache-Control: max-age=0\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n
User-Agent: Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60\r\n
Accept-Encoding: gzip, deflate, lzma, sdch\r\n
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6\r\n
"""
s.send(header)
print s.recv(10000)
返回

HTTP/1.1 400 Bad Request
Server: nginx
Date: Thu, 01 Jan 2015 21:43:47 GMT
Content-Type: text/html
Content-Length: 166
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
HTTP/1.1400错误请求
服务器:nginx
日期:2015年1月1日星期四格林威治时间21:43:47
内容类型:text/html
内容长度:166
连接:关闭
400错误请求
400错误请求

nginx
问题可能在于请求的格式

首先,HTTP请求以换行符开始。此外,HTTP请求中的行必须用
\r\n
分隔,而Python多行字符串只有
\n
。但是,由于您在其中一些(不是全部)中有文字
\r\n
,所以这是一个混乱

最后,标题必须以空行结尾

我的建议是使用没有任何行尾的字符串列表,然后将它们连接起来:

header_lines = [
 "GET / HTTP/1.1",
 "Host: httn",
 "Connection: keep-alive",
 ...
]

header = "\r\n".join(header_lines) + "\r\n\r\n"

请注意,由于
str.join()
没有添加最终的EOL,因此必须添加其中两个以包含必需的空行。

多行Python字符串为每行添加一个额外的\n。注:

>>> s = '''
... Host: rile5.com\r\n
... '''
>>>
>>> s
'\nHost: rile5.com\r\n\n'
每行有一个额外的第一行和两个
\n
。这是可行的,但不适用于您使用的原始IP地址:

import socket
s = socket.socket()
s.connect(("rile5.com", 80))
header = b"""\
GET / HTTP/1.1\r
Host: rile5.com\r
Connection: keep-alive\r
Cache-Control: max-age=0\r
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r
User-Agent: Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60\r
Accept-Encoding: gzip, deflate, lzma, sdch\r
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6\r
\r
"""
s.sendall(header)
print(s.recv(10000))
请注意开头引号后的额外斜杠。这将抑制初始换行

header = b"""\
还要注意末尾的额外空行。这是必需的,以便服务器知道标头已完成


为什么不直接使用
urllib.request

您需要一个有效的主机,以便web服务器恶魔知道您指的是哪个站点。这是一个打字错误,意思是主机:198.57.47.136\r\n您是否能够使用
curl
?urllib.urlopen(“工作否”它没有,但
urllib.urlopen(“工作”)创建一个有效的请求http://rile5.com').read()
会。但是,
urllib.urlopen('http://198.57.47.136“).read()
失败。我刚刚尝试过。它甚至没有返回响应。@54.224.239.54:我的错,你必须在结尾有两个
“\r\n”
。这是因为
str.join()
没有以下线结束最后一行。我正在更正答案。