通过代理隧道化httplib

19
我正在尝试弄清楚如何通过代理将数据发送到服务器。我希望这可以通过tor实现,但由于tor使用SOCKS,似乎无法通过httplib实现(如果我错了,请纠正我)。
这是我目前拥有的内容。
import httplib
con = httplib.HTTPConnection("google.com")
con.set_tunnel(proxy, port)
con.send("Sent Stuff")

问题是,在设置隧道时它似乎会冻结。感谢您的帮助。


“proxy”的值是什么?是名称还是IP地址? - Keith
IP地址。我正在尝试在此示例中使用HTTP代理。 - Max00355
3个回答

18
如果您想使用 HTTP 代理,应该像这样:
import httplib
conn = httplib.HTTPConnection(proxyHost, proxyPort)
conn.request("POST", "http://www.google.com", params)

如果您想使用SOCKS代理,可以使用SocksiPy,就像这个问题中所示:How can I use a SOCKS 4/5 proxy with urllib2?


啊,我明白了,我有点偏差。 - Max00355
8
这种行为很容易使 Python 被归入与 PHP 相同的模糊或令人困惑的语言特性的范畴... 真糟糕! - andig

6

看起来正确的答案是:

http://bugs.python.org/issue11448#msg130413


(注:该链接为英文原文)
import httplib
con = httplib.HTTPConnection(proxyHost, proxyPort)
con.set_tunnel("www.google.com", 80)
con.send("Sent Stuff")

2
作为对Khue Vu答案的跟进,这里提供一个完整的例子。在使用SOCKS代理时,获取工作细节比预期更加复杂。首先,使用以下命令安装PySocks:
pip install PySocks

在实例化HTTPConnection并告知它将使用代理后,您需要手动设置SOCKS代理:

from http.client import HTTPConnection
from urllib.parse import urlparse, urlencode

import socks

url = urlparse("http://final.destination.example.com:8888/")

conn = HTTPConnection('127.0.0.1', 9000) # use socks proxy address
conn.set_tunnel(url.netloc, url.port) # remote host and port that you actually want to talk to
conn.sock = socks.socksocket() # manually set socket
conn.sock.set_proxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9000) # use socks proxy address
conn.sock.connect((url.netloc, url.port)) # remote host and port that you actually want to talk to

request_path = "%s?%s" % (url.path, url.query)
conn.request("POST", request_path, post_data)

请注意,上面的导入是Python3.x。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接