我试图弄清楚如何通过代理将数据发送到服务器。我希望这可以通过 tor 实现,但是由于 tor 使用 SOCKS,所以使用 httplib 显然是不可能的(如果我错了,请纠正我)
这就是我现在所拥有的
import httplib
con = httplib.HTTPConnection("google.com")
con.set_tunnel(proxy, port)
con.send("Sent Stuff")
问题是,设置隧道时它似乎冻结了。谢谢你的帮助。
如果要使用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?
看起来正确的答案是:
http://bugs.python.org/issue11448#msg130413
import httplib
con = httplib.HTTPConnection(proxyHost, proxyPort)
con.set_tunnel("www.google.com", 80)
con.send("Sent Stuff")
作为 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