0

私はトルネードを使用して、 HTTPプロキシを使用して非同期に多くのWebページをフェッチしています。したがって、私のフェッチの多くはエラーで実行されます(私のプロキシは信頼できません)。別のプロキシですぐに再試行したい。次に例を示します。

from tornado import ioloop
from tornado import httpclient

def handle_request(response):
    if response.error:
        print "Error:", response.error
        // HERE i want to put my retry with another proxy
    else:
        print response.body
    ioloop.IOLoop.instance().stop()

http_client = httpclient.AsyncHTTPClient()
http_client.fetch("http://www.google.com/", handle_request)
ioloop.IOLoop.instance().start()

しかし、 handle_requestから現在のループに新しいフェッチイベントを追加するにはどうすればよいですか?また、変数をhandle_requestに渡すにはどうすればよいですか(すべてのプロキシをリストします)。

4

1 に答える 1

2

あなたは2つの質問をしています-

パーシャルの使用を検討しますhttp://docs.python.org/library/functools.html#partial-objects

from functools import partial

PROXIES = [A, B, C, D] # As appropriate
...
def handle_request(proxies, response):
    if ...BAD RESPONSE...:
        return http_client.fetch(response.request.url, partial(handle_request, proxies[1:]))
    # Now handle the case that you have a good result or you're out of proxies

http_client.fetch("http://www.google.com/", partial(handle_request, PROXIES[:]))

もちろん、他の選択肢はそれをオブジェクトにすることです。

class ProxyRequest(object):
     PROXIES = [A, B, C]

     def __init__(self, url):
          self.url = url
          self.proxies = self.PROXIES[:]
          self.fetch()

     def fetch(self):
          p, self.proxies = self.proxies[0], self.proxies[1:]

          http_client.fetch(self.url, self.handle, proxy=p)

     def handle(self, response):
          if response.error:
               if self.proxies:
                     return self.fetch()
               else:
                     ...error case...

          ...stop the ioloop if you want...
于 2012-06-12T18:05:50.347 に答える