如何在龙卷风AsyncHttpClient中使用socks代理? 我发现只使用HTTP代理而不更改lib ...
答案 0 :(得分:11)
根据文档,代理支持仅适用于libcurl
的{{1}}实施。
如果您要深入了解AsyncHTTPClient
传递给HTTPRequest
方法的fetch()
对象,您会注意到prepare_curl_callback
}参数,可以在发送请求之前在setopt
对象上调用PyCurl
。
这是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)
prepare_curl_callback=prepare_curl_socks5
调用的附加关键字参数fetch()
具有魔力,使得CURL使用SOCKS5代理而不是默认的HTTP代理。