2017-05-03 6 views
0

私はそれが何のボトルネックかをテストしました。それはmiddlewearsの選択クエリからです。治療ミドルウェアのボトルネックMySQL選択

class CheckDuplicatesFromDB(object): 

def process_request(self, request, spider): 

    # url_list is a just python list. some urls in there. 
    if (request.url not in url_list): 
     self.crawled_urls = dict() 

     connection = pymysql.connect(host='123', 
            user='123', 
            password='1234', 
            db='123', 
            charset='utf8', 
            cursorclass=pymysql.cursors.DictCursor) 

     try: 
      with connection.cursor() as cursor: 
       # Read a single record 

       sql = "SELECT `url` FROM `url` WHERE `url`=%s" 
       cursor.execute(sql, request.url) 
       self.crawled_urls = cursor.fetchone() 

      connection.commit() 
     finally: 
      connection.close() 

     if(self.crawled_urls is None): 
      return None 
     else: 
      if (request.url == self.crawled_urls['url']): 
       raise IgnoreRequest() 
      else: 
       return None 
    else: 
     return None 

私はsetting.pyDOWNLOADER_MIDDLEWEARSを無効にした場合、scrapyクロール速度は悪くないです。無効前

scrapy.extensions.logstats] INFO:無効にした後にクロール4ページ(0ページ/分で)(/分の2つの項目で)4個の商品を掻き

[scrapy.extensions.logstats] INFO:クロール55ページ(55ページ/分)、(/分の商品で)0アイテムを掻き

選択クエリが問題だと思います。だから、私は一度クエリを選択し、要求を入れるURLデータを取得したいと希望finger_prints

私はCrawlerProcessを使用しています。スパイダーが多いほど、ページ/分が少なくなります。

例:

  • 1スパイダー=> 50ページ/分
  • 2スパイダー=>合計30ページ/分
  • 6スパイダー=>合計10ページ/分

私がしたいのは:

  1. からのURLデータを取得する
  2. は、私はこれを行うことができますどのようにfinger_prints

を要求するURLデータを置きますか?

答えて

0

大きな問題の1つは、process_requestへの各応答/呼び出しでSQLデータベースへの新しい接続を開くことです。代わりに接続を一度開いておいてください。

これにより大きなスピードアップが発生しますが、一度修正すれば他のボトルネックが発生すると思われます。