Scrapyを使用して、冗長な情報を共有している可能性のあるいくつかのWebサイトをクロールしています。
スクレイプするページごとに、ページのURL、タイトル、およびHTMLコードをmongoDBに保存します。データベースでの重複を避けたいので、同様のアイテムがすでに保存されているかどうかを確認するためにパイプラインを実装します。そのような場合、私は例外を提起しDropItem
ます。
私の問題は、DropItem
例外を発生させてアイテムをドロップするたびに、Scrapyがアイテムのコンテンツ全体をログ(stdoutまたはファイル)に表示することです。スクレイピングされた各ページのHTMLコード全体を抽出しているので、ドロップした場合は、HTMLコード全体がログに表示されます。
コンテンツを表示せずにアイテムをサイレントにドロップするにはどうすればよいですか?
お時間をいただきありがとうございます!
class DatabaseStorage(object):
""" Pipeline in charge of database storage.
The 'whole' item (with HTML and text) will be stored in mongoDB.
"""
def __init__(self):
self.mongo = MongoConnector().collection
def process_item(self, item, spider):
""" Method in charge of item valdation and processing. """
if item['html'] and item['title'] and item['url']:
# insert item in mongo if not already present
if self.mongo.find_one({'title': item['title']}):
raise DropItem('Item already in db')
else:
self.mongo.insert(dict(item))
log.msg("Item %s scraped" % item['title'],
level=log.INFO, spider=spider)
else:
raise DropItem('Missing information on item %s' % (
'scraped from ' + item.get('url')
or item.get('title')))
return item