¿Crawler produce duplicados cuando se ejecuta dos veces?
-
24-10-2019 - |
Pregunta
Utilizo el marco de Crawler "Scrapy" en Python y uso el archivo Pipelines.py para almacenar mis elementos en formato JSON en un archivo. El código para hacer esto se proporciona a continuación Importar 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
El problema es que cuando ejecuto mi Crawler dos veces (digamos) luego en mi archivo obtengo elementos acanterados. El archivo era un formato JSON, por lo que lo decodificé con la función json.loads () pero no funciona:
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
.
Sugiera un método para hacer esto.
Nota: Tenga en cuenta que tengo que abrir el archivo en modo "Agregar", ya que puedo rastrear un conjunto diferente de enlaces, pero ejecutar el rastreador dos veces con el mismo inicio_url debería escribir los mismos datos en el archivo dos veces
Solución
Puede filtrar duplicados utilizando un middleware personalizado, por ejemplo, este. Sin embargo, para usar esto en su araña, necesitará dos cosas más: alguna forma de asignar identificaciones a los elementos para que el filtro pueda identificar duplicados y alguna forma de persistir el conjunto de identificaciones visitadas entre las corridas de araña. El segundo es fácil: podría usar algo pitónico como Shelve, o puede usar una de las muchas tiendas de valor clave que son populares en estos días. Sin embargo, la primera parte será más difícil y dependerá del problema que esté tratando de resolver.