在Tornado AsyncHttpClient中使用Socks代理
我该如何在Tornado的AsyncHttpClient中使用socks代理?我发现只可以使用HTTP代理,而不需要更改库...
1 个回答
12
根据文档,代理支持只适用于libcurl
实现的AsyncHTTPClient
。
如果你仔细看看你传给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代理。