在龙卷风中的Socks代理AsyncHttpClient

时间:2014-04-05 15:12:25

标签: python tornado

如何在龙卷风AsyncHttpClient中使用socks代理? 我发现只使用HTTP代理而不更改lib ...

1 个答案:

答案 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代理。