scrapy中间件的瓶颈MySQL选择

时间:2017-05-03 13:34:41

标签: mysql scrapy fingerprint

我测试了它的瓶颈。它来自中间人的选择查询。

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

如果我在DOWNLOADER_MIDDLEWEARS中停用了setting.py,则scrapy抓取速度也不错。

禁用前:

  

scrapy.extensions.logstats]信息:抓取4页(每分钟0页),抓4件(每件2件/分)

禁用后:

  

[scrapy.extensions.logstats]信息:抓取55页(每页55页),抓取0项(每0分钟一次)

我猜选择查询是个问题。所以,我想选择一次查询并获取一个url数据来放置请求finger_prints

我正在使用CrawlerProcess:蜘蛛越多,抓取页面/分钟越少。

示例:

  • 1蜘蛛=> 50页/分钟
  • 2蜘蛛=>总共30页/分钟
  • 6蜘蛛=>总共10页/分钟

我想做的是:

  1. 从MySQL获取网址数据
  2. 将网址数据添加到请求finger_prints
  3. 我该怎么做?

1 个答案:

答案 0 :(得分:0)

一个主要问题是,每次响应/调用process_request时,都要打开与sql数据库的新连接。而是打开连接一次并保持打开状态。

虽然这会导致重大加速,但我怀疑还有其他瓶颈,一旦修复就会出现这种瓶颈。