Frage

Ich verwende das Crawler -Framework "Scrapy" in Python und verwende die Datei pipelines.py, um meine Artikel in einem JSON -Format in einer Datei zu speichern

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

Das Problem besteht darin Datei war ein JSON -Format, also habe ich sie mit json.loads () -Funktion dekodiert, aber es funktioniert nicht:

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
    .

Bitte schlagen Sie eine Methode vor.

Hinweis: Bitte beachten Sie, dass ich die Datei im "Append" -Modus öffnen muss, da ich möglicherweise eine andere Reihe von Links kriechen kann, aber das Ausführen des Crawlers zweimal mit demselben Start_url, sollte dieselben Daten zweimal in die Datei schreiben

War es hilfreich?

Lösung

Sie können Duplikate mithilfe von benutzerdefinierten Middleware, z. Dies. Um dies tatsächlich in Ihrer Spinne zu verwenden, benötigen Sie zwei weitere Dinge: eine Möglichkeit, Elementen IDs zuzuweisen, damit Sie der Filter Duplikate identifizieren können, und eine Möglichkeit, die besuchten IDs zwischen Spinnenläufen zu behalten. Die zweite ist einfach-Sie könnten etwas Pythonisches Regal verwenden oder eines der vielen Schlüsselwerte, die heutzutage beliebt sind, verwenden. Der erste Teil wird jedoch schwieriger und wird von dem Problem abhängen, das Sie lösen möchten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top