tornado总结11-AsyncHTTPClient使用HTTP代理

参考文档

HTTPRequest AsyncHTTPClient.configure HTTP 599: Timeout in request queue 异常处理

说明

tornado的AsyncHTTPClient作为爬虫客户端使用起来很方便, 但是为了应对网站的IP访问限制,这个时候就需要使用IP代理机制了, AsyncHTTPClient经过简单的配置就可以使用HTTP代理来进行http访问了, 正好结合tornado的异步机制,就可以同时开多个连接去访问不同的内容,提高爬取速度。

不过在windows上由于curl库的关系,我没有跑起来,本文的代码可以跑在linux下面。

代码

AsyncHTTPClient使用HTTP代理

import tornado.ioloop
from tornado.httpclient import HTTPRequest, AsyncHTTPClient


@tornado.gen.coroutine
def send_requ():
    http_requ = HTTPRequest(
        url='http://www.baidu.com',
        method='GET',
        proxy_host = 'a.b.c.d',  # 配置HTTP代理的ip地址
        proxy_port = 1234, # 设置HTTP代理的端口
    )

    http_resp = yield AsyncHTTPClient().fetch(http_requ)

    #处理回复消息。。。

if __name__ == "__main__":
    # 配置 AsyncHTTPClient
    AsyncHTTPClient.configure(
        "tornado.curl_httpclient.CurlAsyncHTTPClient",  # 必须配置这个不然无法使用代理
        max_clients=600  # 客户端池数量配置设大一点
    )

    tornado.ioloop.IOLoop.run_sync(send_requ)

AsyncHTTPClient禁止排队超时

上面的那段代码在程序启动时会调用AsyncHTTPClient.configure将最大的可用客户端数量设置为600了,到达600之后所有待发送的请求都会进入排队机制,但是该队列里面的请求有个排队时间,如果超时tornado将会丢弃这个请求并给调用方抛出一个异常。

tornado.httpclient.HTTPError: HTTP 599: Timeout in request queue

下面的代码可以让AsyncHTTPClient排队的请求不会超时

from tornado.httpclient import AsyncHTTPClient
from tornado.log import gen_log
from tornado.simple_httpclient import SimpleAsyncHTTPClient


class NoQueueTimeoutHTTPClient(SimpleAsyncHTTPClient):
    def fetch_impl(self, request, callback):
        key = object()

        self.queue.append((key, request, callback))
        self.waiting[key] = (request, callback, None)

        self._process_queue()

        if self.queue:
            gen_log.debug("max_clients limit reached, request queued. %d active, %d queued requests." % (
                len(self.active), len(self.queue)))

AsyncHTTPClient.configure(NoQueueTimeoutHTTPClient, max_clients=20)

转载于:https://my.oschina.net/u/111188/blog/1551321

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值