Crawler выдает дубликаты при запуске дважды?

1

Я использую фреймворк "scrapy" в python, и я использую файл pipelines.py для хранения моих элементов в формате json для файла. Код для этого приведен ниже import json

class AYpiPipeline(object):
def __init__(self):
    self.file = open("a11ypi_dict.json","ab+")


# this method is called to process an item after it has been scraped.
def process_item(self, item, spider):
    d = {}    
    i = 0
# Here we are iterating over the scraped items and creating a dictionary of    dictionaries.
try:
    while i<len(item["foruri"]):
        d.setdefault(item["foruri"][i],{}).setdefault(item["rec"][i],{})[item["foruri_id"][i]] = item['thisurl'] + ":" + item["thisid"][i]
    i+=1
except IndexError:
    print "Index out of range"
    # Writing it to a file
    json.dump(d,self.file)
return item

Проблема заключается в том, что я дважды запускаю свой искатель (скажем), а затем в моем файле получаются дублированные предметы. Я попытался предотвратить его, сначала прочитав из файла, а затем сопоставив данные с новыми данными, которые будут записаны, но данные чтение из файла было json-форматом, поэтому я расшифровал его с помощью функции json.loads(), но он не работает:

import json 

class AYpiPipeline(object):
    def __init__(self):
        self.file = open("a11ypi_dict.json","ab+")
        self.temp = json.loads(file.read())

    # this method is called to process an item after it has been scraped.
    def process_item(self, item, spider):
        d = {}    
        i = 0
        # Here we are iterating over the scraped items and creating a dictionary of    dictionaries.
        try:
            while i<len(item["foruri"]):
            d.setdefault(item["foruri"][i],{}).setdefault(item["rec"][i],{})[item["foruri_id"][i]] = item['thisurl'] + ":" + item["thisid"][i]
            i+=1
        except IndexError:
            print "Index out of range"
        # Writing it to a file

             if d!=self.temp: #check whether the newly generated data doesn't match the one already in the file
                  json.dump(d,self.file)
        return item
    .

Пожалуйста, предложите метод для этого.

Примечание. Обратите внимание, что мне нужно открыть файл в режиме "добавить", так как я могу сканировать другой набор ссылок, но дважды запускать искатель с тем же start_url должен дважды записывать те же данные в файл

  • 0
    Я думаю, что решение состоит в том, чтобы предотвратить одновременное выполнение нескольких экземпляров скрипта. Для этого вы можете использовать блокировки файлов (внутри скрипта или снаружи, используя такие утилиты, как flock). Каковы причины для нескольких экземпляров сканера?
Теги:
scrapy
web-crawler

1 ответ

1
Лучший ответ

Вы можете отфильтровывать дубликаты с помощью специального пользовательского промежуточного программного обеспечения, например this. Чтобы на самом деле использовать это в вашем пауке, вам понадобится еще две вещи: некоторый способ назначения идентификаторов элементам, чтобы фильтр мог идентифицировать дубликаты и какой-то способ сохранить набор посещенных идентификаторов между прогонами пауков. Второе легко - вы можете использовать что-то вроде pythonic как shelve, или вы можете использовать один из многих магазинов с ключевыми значениями, которые популярны в наши дни. Однако первая часть будет сложнее и будет зависеть от проблемы, которую вы пытаетесь решить.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню