2013-08-11 12 views
23

के साथ एक JSON प्रतिक्रिया स्क्रैपिंग JSON लौटने वाले वेब अनुरोधों को स्क्रैप करने के लिए आप स्केपर का उपयोग कैसे करते हैं? उदाहरण के लिए, JSON इस प्रकार दिखाई देगा:स्क्रैप

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

मैं विशिष्ट आइटम (उदा name और fax ऊपर में) स्क्रैप और सीएसवी को बचाने के लिए की तलाश में की जाएगी।

उत्तर

39

यह HTML प्रतिक्रियाओं के लिए स्केपर के HtmlXPathSelector का उपयोग करने जैसा ही है।

class MySpider(BaseSpider): 
    ... 


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

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

     return item 

आशा है कि मदद करता है: फर्क सिर्फ इतना है कि आप प्रतिसाद पार्स करने json मॉड्यूल का उपयोग करना चाहिए।

+5

आप उपयोग करने के लिए 'चाहते हो सकता है json.loads (response.body_as_unicode())' भार एक 'str' या' unicode' वस्तु है, न कि scrapy प्रतिक्रिया की आवश्यकता है। –

+1

लोग, तो अब आपने एक जेसन प्रतिक्रिया पार्स कर दी है। मैं जेसन में संभावित रूप से प्रत्येक लिंक का पालन कैसे करूं? – Cmag

+3

@Cmag आपको 'वापसी' या 'उपज' 'अनुरोध 'की आवश्यकता होगी, अधिक जानकारी देखें [यहां] (http://doc.scrapy.org/en/latest/topics/request-response.html#passing- अतिरिक्त-डेटा-टू-कॉलबैक-कार्यों)। – alecxe

0

जेएसओएन लोड नहीं होने का संभावित कारण यह है कि इसमें पहले और बाद में सिंगल-कोट्स हैं। इस प्रयास करें:

json.loads(response.body_as_unicode().replace("'", '"')) 
संबंधित मुद्दे