【发布时间】:2014-04-05 15:12:25
【问题描述】:
如何在 tornado AsyncHttpClient 中使用 socks 代理? 我发现可以只使用 HTTP 代理而不更改库...
【问题讨论】:
如何在 tornado AsyncHttpClient 中使用 socks 代理? 我发现可以只使用 HTTP 代理而不更改库...
【问题讨论】:
根据文档,代理支持仅适用于AsyncHTTPClient 的libcurl 实现。
如果您深入了解您传递给fetch() 方法的HTTPRequest 对象,您会注意到有一个额外的prepare_curl_callback 参数,它可以在PyCurl 上调用setopt发送请求之前的对象。
这里有一个 prepare_curl_callback 函数的小例子:
import pycurl
def prepare_curl_socks5(curl):
curl.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
还有一个完整的用法示例:
import tornado
import tornado.ioloop
import tornado.gen
import tornado.httpclient
import pycurl
def prepare_curl_socks5(curl):
curl.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
@tornado.gen.coroutine
def main():
# set CurlAsyncHTTPClient the default AsyncHTTPClient
tornado.httpclient.AsyncHTTPClient.configure(
"tornado.curl_httpclient.CurlAsyncHTTPClient")
http_client = tornado.httpclient.AsyncHTTPClient()
http_request = tornado.httpclient.HTTPRequest(
"http://jsonip.com",
prepare_curl_callback=prepare_curl_socks5,
proxy_host="localhost",
proxy_port=9050
)
response = yield http_client.fetch(http_request)
print response.body
if __name__ == '__main__':
tornado.ioloop.IOLoop.instance().run_sync(main)
fetch() 调用的附加关键字参数 prepare_curl_callback=prepare_curl_socks5 具有魔力,使 CURL 使用 SOCKS5 代理而不是默认的 HTTP 代理。
【讨论】: