如何让你的scrapy蜘蛛部署长期运行

时间:2016-02-25 09:58:12

标签: python scrapy scrapyd

我正在使用Scrapy框架构建一个刮刀,以便废弃一个网店。这个网店有几个cat和subcat

我已经完成了蜘蛛,它就像一个魅力。我目前使用蜘蛛的start url =[]参数(crawler basespider。)来废弃我想要的子目录。

现在,我正在部署蜘蛛以便定期运行它。我知道解决方案scrapyd并且已经安装了它。

但我不知道构建蜘蛛部署架构的好方法是什么

  • 为网店的每个子猫制作一只蜘蛛,这意味着每只蜘蛛都会有一个开始网址/规则。

  • 对于我从文件中获取的每个subcat网上商店,使用带有许多启动网址的起始网址,db,无论如何。

另一个问题是因为我只使用一个管道将项目存储在mysql数据库中。我需要为每个subcat创建一个表,所以我可能需要为每个蜘蛛提供一个管道,因为我正在管道内进行sql查询。

如果我决定为每个subcat制作一个蜘蛛,这意味着我需要制作大量的管道类,但我不确定这是使蜘蛛管道偶然发生的好方法。 这是我的管道类

class MySQLStorePipeline(object):
"""A pipeline to store the item in a MySQL database.
This implementation uses Twisted's asynchronous database API.
"""

def __init__(self, dbpool):
    self.dbpool = dbpool

@classmethod
def from_settings(cls, settings):
    dbargs = dict(
        host=settings['MYSQL_HOST'],
        db=settings['MYSQL_DBNAME'],
        user=settings['MYSQL_USER'],
        passwd=settings['MYSQL_PASSWD'],
        charset='utf8',
        use_unicode=True,
        port=3306,
        init_command='SET NAMES UTF8',
    )
    dbpool = adbapi.ConnectionPool('MySQLdb', **dbargs)
    return cls(dbpool)

def process_item(self, item, spider):
    # run db query in the thread pool
    d = self.dbpool.runInteraction(self._do_upsert, item, spider)
    d.addErrback(self._handle_error, item, spider)
    # at the end return the item in case of success or failure
    d.addBoth(lambda _: item)
    # return the deferred instead the item. This makes the engine to
    # process next item (according to CONCURRENT_ITEMS setting) after this
    # operation (deferred) has finished.
    return d

def _do_upsert(self, conn, item, spider):
    """Perform an insert or update."""
    guid = self._get_guid(item)
    now = datetime.utcnow().replace(microsecond=0).isoformat(' ')

    conn.execute("""SELECT EXISTS(
        SELECT 1 FROM vtech WHERE guid = %s
    )""", (guid, ))
    ret = conn.fetchone()[0]

    if ret:
        conn.execute("""
            UPDATE vtech
            SET prix=%s, stock=%s, updated=%s
            WHERE guid=%s
        """, (item['prix'], item['stock'], now, guid))
        print '------------------------'
        print 'Data updated in Database'
        print '------------------------'

    else:
        conn.execute("""
            INSERT INTO vtech (guid, nom, url, prix, stock, revendeur, livraison, img, detail, bullet, categorie, updated, created)
            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
        """, (guid, item['nom'], item['url'], item['prix'], item['stock'], item['revendeur'], item['livraison'], item['img'], item['detail'],item['bullet'], item['categorie'], now, 0))
        print '------------------------'
        print 'Data Stored in Database'
        print '------------------------'


def _handle_error(self, failure, item, spider):
    """Handle occurred on db interaction."""
    # do nothing, just log
    log.err(failure)

def _get_guid(self, item):
    """Generates an unique identifier for a given item."""
    # hash based solely in the url field
    return md5(item['url']).hexdigest()

我看了一下configparser,想让一个config.ini尝试managne启动url和sql查询,但看起来是一个丑陋的黑客代码。

我已经阅读了很多SO帖子,但我从未发现过刮刀设计结构的问题。但是对我来说,目前还不清楚长期用于scrapy生产蜘蛛的通行证。

感谢您的回答。

以下是我读过的一些帖子

Pipeline design

Scrapy Args spider

Giving url

0 个答案:

没有答案