Python 请求HTTP头
模块请求返回的HTTP头有问题 我正在使用以下代码:Python 请求HTTP头,python,http,http-headers,python-requests,response,Python,Http,Http Headers,Python Requests,Response,模块请求返回的HTTP头有问题 我正在使用以下代码: #!/usr/bin/env python # -*- coding: utf-8 -*- import requests response = requests.get("http://www.google.co.il",proxies={'http': '','https':''}) data = response.text # response.text returns the appropriate html code #
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
response = requests.get("http://www.google.co.il",proxies={'http': '','https':''})
data = response.text
# response.text returns the appropriate html code
# (<!doctype html><html dir="rtl" itemscope=""....)
if response.status_code == requests.codes.ok:
# How do I send those headers to the conn (browser)
print "HEADERS: " + str(response.headers)
conn.send(data)
有人告诉我,问题是我没有向浏览器发送任何标题。这真的是问题吗?还有其他建议吗?如果是问题,如何将适当的标题发送到浏览器
编辑:我忘了提到连接是
通过代理服务器
任何帮助都会很好
非常感谢,亚利 我在
请求
文档中找不到任何关于获取原始http响应(而不是响应.raw
)的信息,因此我编写了一个函数:
def http_response(response):
return 'HTTP/1.1 {} {}\r\n{}\r\n\r\n{}'.format(
response.status_code, response.reason ,
'\r\n'.join(k + ': ' + v for k, v in response.headers.items()),
response.content
)
我通过将FirefoxHTTP proxy设置为localhost:port(在端口上有一个监听套接字)对其进行了测试,结果很好
或者,您可以从conn.recv
获取主机,向该主机打开一个新的套接字,然后发送数据。例如:
data = conn.recv(1024)
host = [ l.split(':')[1].strip() for l in data.splitlines() if l.startswith('Host:') ]
if len(host) :
cli = socket.socket()
cli.connect((host[0], 80))
cli.send(data)
response = ''
while True :
data = cli.recv(1024)
if not data.strip() :
break
response += data
conn.send(response)
cli.close()
其中
conn
是与web浏览器的连接。这只是一个简单的示例,假设您只有HTTP请求(端口80)。还有很多优化的余地什么是conn
?套接字?是的,conn
是一个套接字。有点像拦截代理,对吗?您必须向浏览器发送完整的HTTP响应,而不仅仅是正文。如果您使用的是套接字,则可以跳过请求
,并使用套接字
发送HTTP请求。如果您坚持使用请求
,则必须从响应
对象中构造标题。@t.m.adam是否介意使用这些方法编写答案?因为我不知道如何使用socket
发送http请求,也不知道如何从响应中构建标头。好的,请稍等。很遗憾,当我尝试连接到“www.google.com”时,我在浏览器中收到此错误:ERR_TUNNEL_CONNECTION_失败(与任何其他http/s相同),并且它没有显示正确的网站。我确实收到了正确的html转储文件。知道为什么会这样吗?(我只会在5小时内投票给你,我已经超过了我的最大投票数lol)我不能确定,除非我看到你的代码,但如果你正在构建一个智能代理,这是一个ssl问题。谷歌只使用HTTPS,你应该sslwrap你的套接字(创建一个证书,将它添加到可信的权威机构,等等)。尝试连接到端口80上的stackoverflow,并让我知道发生了什么目前为止做得不错,但如果您想处理HTTPS,还有很多事情要做。这与请求无关
,它是关于服务器的,而且它不仅仅是五行代码。基本上,您的浏览器将向您的代理发送连接请求。你必须回复200,然后sslwrap插座。您还需要创建证书和密钥(使用openssl),并将该证书添加到浏览器的受信任权限中。我现在不能给你一个链接,但是你应该在Github上找到很多例子。如果你不在乎拦截HTTPS流量或使用请求
,你可以跳过sslwrap和证书部分,使用选择。选择
,循环中有一个小的超时(就像脚本的admin\u connection
函数一样)。如果选择这种方法,你应该设置一个标志来中断循环,例如如果在4次迭代后没有收到任何消息。但是,这种方法会容易得多。如果你这样做是为了娱乐或研究,我建议尝试这两种方法
data = conn.recv(1024)
host = [ l.split(':')[1].strip() for l in data.splitlines() if l.startswith('Host:') ]
if len(host) :
cli = socket.socket()
cli.connect((host[0], 80))
cli.send(data)
response = ''
while True :
data = cli.recv(1024)
if not data.strip() :
break
response += data
conn.send(response)
cli.close()