Я использую фреймворк сканера «scrapy» в python, и я использую файл pipes.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 должен дважды записывать одни и те же данные в файл.