2016-06-15 5 views
0

私はPython +竜巻にPythonクラスを持っています、それはクローラーのように動作します。私は同じサイトにたくさんのリンクを持っているので、私はそれらすべてから私のデータベースに回答を得る必要があります。 これでは難しいです:私はどのように私はエラー(タイムアウト、またはランタイムのexeptions)を持って、URLをキャッチすることができない理解できません。 これを初心者用コード(私はPython上でちょうど1週間のコードを持っています)で修正する方法を知っています - 入力リンクと出力のリストを比較しますが、私は正しいやり方をしたいと思います。 どうすればいいですか?タイムアウトしたかエラーが発生したURLを取得するには?

import time 
import requests 
import json 
from tornado import gen, ioloop 
from tornado.httpclient import AsyncHTTPClient, HTTPRequest 
from tornado.queues import Queue 

class Scraper(): 
    def __init__(self, source='', destinations=None, transform=None, headers={ }, max_clients=20, maxsize=20, connect_timeout=600, request_timeout=600): 
     """Instantiate a tornado async http client to do many URL requests""" 

     if None in destinations: 
      sys.stderr.write('You must pass both collection of URLS and a transform function') 
      raise SystemExit 
     self.max_clients = max_clients 
     self.maxsize = maxsize 
     self.connect_timeout = connect_timeout 
     self.request_timeout = request_timeout 
     # AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient", max_clients=50) 
     AsyncHTTPClient.configure("tornado.simple_httpclient.SimpleAsyncHTTPClient", max_clients=self.max_clients) 
     self.headers = headers 
     self.http_client = AsyncHTTPClient() 
     self.queue = Queue(maxsize=20) 
     self.source = source 
     self.destinations = destinations 
     self.transform = transform 
     self.read(self.destinations) 
     self.get(self.transform, self.headers, self.connect_timeout, self.request_timeout) 
     self.loop = ioloop.IOLoop.current() 
     self.join_future = self.queue.join() 

     def done(future): 
      self.loop.stop() 

     self.join_future.add_done_callback(done) 
     self.loop.start() 

    @gen.coroutine 
    def read(self, destinations): 
     for url in destinations: 
      yield self.queue.put(url) 

    @gen.coroutine 
    def get(self, transform, headers, connect_timeout, request_timeout): 
     while True: 
      url = yield self.queue.get() 
      request = HTTPRequest(url, 
           connect_timeout=connect_timeout, 
           request_timeout=request_timeout, 
           method="GET", 
           headers = headers 
           ) 

      future = self.http_client.fetch(request) 
      def done_callback(future): 
       self.queue.task_done() 
       body = future.result().body 
       transform(body) 


      future.add_done_callback(done_callback) 

def transform_data(body, url=''): 

    #SOMECODE 

a = ['link1', 'link2'] 
scraper = Scraper(destinations=a, transform=transform_data) 

答えて

0

コルーチンでは、未来を「譲る」ことができます。その他の例について

try: 
    result = yield self.http_client.fetch(request) 
except Exception as exc: 
    print("Failure!: %s" % exc) 
else: 
    self.queue.task_done() 
    body = result.body 
    transform(body) 

see the Tornado documentation for HTTP clients:将来の結果または例外に分解されるまで、コルーチンが一時停止します。

+0

なぜ、私は、シングルスレッドのカールのようにゆっくりとスクラップするのですか?同じようなUrコードと同じ場所で、なぜ私は理解していない –

関連する問題