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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top