Python でクローラー フレームワーク「scrapy」を使用し、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
問題は、クローラーを 2 回実行すると (たとえば)、ファイルに重複したスクレイピング アイテムが表示されることです。最初にファイルから読み取り、次にデータを書き込む新しいデータと一致させることでそれを防止しようとしましたが、データはファイルは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 でクローラーを 2 回実行すると、同じデータがファイルに 2 回書き込まれます。