我正在使用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生产蜘蛛的通行证。
感谢您的回答。
以下是我读过的一些帖子