Python 请求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 #

模块请求返回的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 
# (<!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()