2013-08-11 9 views
23

Wie scrapieren Sie Webanforderungen, die JSON zurückgeben, mit Scrapy? Zum Beispiel würde die JSON wie folgt aussehen:Scraping einer JSON-Antwort mit Scrapy

{ 
    "firstName": "John", 
    "lastName": "Smith", 
    "age": 25, 
    "address": { 
     "streetAddress": "21 2nd Street", 
     "city": "New York", 
     "state": "NY", 
     "postalCode": "10021" 
    }, 
    "phoneNumber": [ 
     { 
      "type": "home", 
      "number": "212 555-1234" 
     }, 
     { 
      "type": "fax", 
      "number": "646 555-4567" 
     } 
    ] 
} 

würde ich bestimmte Elemente zu kratzen suchen (z name und fax in der oben) und csv speichern.

Antwort

39

Es ist das gleiche wie Scrapy HtmlXPathSelector für HTML-Antworten verwenden. Der einzige Unterschied ist, dass Sie json Modul verwenden sollten, um die Antwort zu analysieren:

class MySpider(BaseSpider): 
    ... 


    def parse(self, response): 
     jsonresponse = json.loads(response.body_as_unicode()) 

     item = MyItem() 
     item["firstName"] = jsonresponse["firstName"]    

     return item 

Hoffnung, das hilft.

+5

Möglicherweise möchten Sie verwenden 'json.loads (response.body_as_unicode())' als Lasten erfordert eine 'str' oder' unicode' Objekt, kein scrapy Antwort. –

+1

Leute, so haben Sie jetzt eine JSON-Antwort analysiert. Wie würde ich jedem Link folgen, der möglicherweise in der JSON ist? – Cmag

+3

@Cmag müssen Sie 'request' oder' yield' eine 'Anfrage' zurückgeben, weitere Informationen [hier] (http://doc.scrapy.org/en/latest/topics/request-response.html#passing- Zusatzdaten-zu-Rückruf-Funktionen). – alecxe

0

Der mögliche Grund, warum JSON nicht geladen wird, ist, dass es vorher und nachher einfache Anführungszeichen hat. Versuchen Sie folgendes:

json.loads(response.body_as_unicode().replace("'", '"'))