2013-08-11 17 views
23

JSON'a geri dönen web isteklerini kazıyarak Scrapy'i nasıl kullanırsınız? Örneğin, JSON şu şekilde görünecektir: Belirli öğeleri (yukarıdaki örn name ve fax) kazımak ve csv kaydetmek isteyen olurduScrub ile JSON yanıtı kazıma

{ 
    "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" 
     } 
    ] 
} 

.

cevap

39

html yanıtları için Scrapy's HtmlXPathSelector'u kullanmakla aynı şey.

class MySpider(BaseSpider): 
    ... 


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

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

     return item 

Umut yardımcı olur: Tek fark yanıtı ayrıştırmak için json modülü kullanmak gerektiğidir.

+5

Sen 'kullanmak isteyebilirsiniz json.loads (response.body_as_unicode())' yükleri bir 'str' veya' unicode' nesneyi değil, bir scrapy Tepki gerektirdiğinden. –

+1

millet, şimdi bir json yanıtı ayrıştırdınız. Potansiyel olarak jsonda olan her bağlantıyı nasıl takip edeyim? – Cmag

+3

@Cmag, "İade" veya "Talep" vermeniz gerekir, daha fazla bilgi için [burada] bakın (http://doc.scrapy.org/en/latest/topics/request-response.html#passing- ek veri-için-geri-fonksiyonlar). – alecxe

0

JSON yüklenememesinin olası sebebi, önce ve sonra tek tırnak işareti olmasıdır. Bu deneyin:

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