Scrapyを使用して複数のWebサイトをクロールしています。Scrapy - アイテムを静かにドロップする
私が掻き集めるページごとに、ページのURL、タイトル、およびHTMLコードをmongoDBに保存します。 私はデータベースに重複を避けたいので、類似の項目が既に格納されているかどうかを確認するためにパイプラインを実装します。このような場合、私はDropItem
例外を発生させます。
raisonでアイテムをドロップするたびに、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
これはどこですか?ミドルウェア?パイプライン? – Xodarap777
@ Xodarap777、私は 'middlewares.py'ファイルがより適切だと思います。あるいは、 'logformatter.py'のような新しいファイルを作成することもできます。この回答のコードは、スパイダーを使ってファイルにコードを入れることを示しています。 **注**:このコードは廃止されましたが、下記の@mirosvalの回答が作業バージョンを更新しました。 – kupgov