7

Web スクレイピング プロジェクトで MongoEngine を使用しています。スクレイピングされたすべての Web ページで遭遇したすべての画像を追跡したいと思います。

そのために、画像のsrcURL と画像に遭遇した回数を保存します。

MongoEngine モデルの定義は次のとおりです。

class ImagesUrl(Document):
    """ Model representing images encountered during web-scraping.

    When an image is encountered on a web-page during scraping,
    we store its url and the number of times it has been
    seen (default counter value is 1).
    If the image had been seen before, we do not insert a new document
    in collection, but merely increment the corresponding counter value.

    """

    # The url of the image. There cannot be any duplicate.
    src = URLField(required=True, unique=True)

    # counter of the total number of occurences of the image during
    # the datamining process
    counter = IntField(min_value=0, required=True, default=1)

「保存またはインクリメント」プロセスを実装する適切な方法を探しています。

これまでのところ、私はそのように扱っていますが、MongoEngine でそれを行うためのより良い組み込みの方法があるかもしれないと感じています。

def save_or_increment(self):
    """ If it is the first time the image has been encountered, insert
        its src in mongo, along with a counter=1 value.
        If not, increment its counter value by 1.

    """ 
    # check if item is already stored
    # if not, save a new item
    if not ImagesUrl.objects(src=self.src):
        ImagesUrl(
            src=self.src,
            counter=self.counter,
            ).save()
    else:
        # if item already stored in Mongo, just increment its counter
        ImagesUrl.objects(src=self.src).update_one(inc__counter=1)

それを行うより良い方法はありますか?

どうぞよろしくお願いいたします。

4

2 に答える 2

12

たとえば、アップサートを実行できるはずです。

 ImagesUrl.objects(src=self.src).update_one(
                                  upsert=True, 
                                  inc__counter=1, 
                                  set__src=self.src)
于 2013-01-31T10:39:34.773 に答える