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