2013-08-11 20 views
23

W jaki sposób używasz narzędzia Scrapy do pobierania z sieci żądań zwracających JSON? Na przykład, JSON będzie wyglądać następująco:Skrobanie odpowiedzi JSON za pomocą usługi 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" 
     } 
    ] 
} 

będę patrząc zeskrobać konkretne elementy (np name i fax wyżej) i zapisać do pliku CSV.

Odpowiedz

39

Jest to to samo, co używanie odpowiedzi Scrapy na HtmlXPathSelector dla odpowiedzi na html. Jedyną różnicą jest to, że należy użyć modułu json do analizowania odpowiedzi:

class MySpider(BaseSpider): 
    ... 


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

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

     return item 

nadzieję, że pomoże.

+5

Możesz użyć 'json.loads (response.body_as_unicode())' jak ładunki wymaga 'str' lub' unicode' obiektu, a nie odpowiedzią scrapy. –

+1

ludzie, więc teraz przeanalizowałeś odpowiedź jsona. jak podążałbym za każdym linkiem, który jest potencjalnie w jsonie? – Cmag

+3

@Cmag musisz "zwrócić" lub 'wydać' 'Request', zobaczyć więcej informacji [tutaj] (http://doc.scrapy.org/en/latest/topics/request-response.html#passing- dodatkowe funkcje danych do wywołania zwrotnego). – alecxe

0

Możliwą przyczyną, dla której JSON nie ładuje się, jest to, że zawiera pojedyncze cudzysłowy przed i po. Spróbuj tego:

json.loads(response.body_as_unicode().replace("'", '"')) 
Powiązane problemy