2017-11-22 2 views
1

Ich möchte JSON-Daten von einer Webseite extrahieren, also habe ich es untersucht. Data I müssen, ist im folgenden Format gespeichert:lesen Json aus dem Web von scrapy in Python2

<script type="application/ld+json"> 
    { 
    'data I want to extract' 
    } 
    </script> 

Ich habe versucht, zu verwenden:

import scrapy 
import json 

class OpenriceSpider(scrapy.Spider): 
    name = 'openrice' 
    allowed_domains = ['www.openrice.com'] 

    def start_requests(self): 
     headers = { 
      'accept-encoding': 'gzip, deflate, sdch, br', 
      'accept-language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4', 
      'upgrade-insecure-requests': '1', 
      'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36  (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36', 
      'accept':  'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 
      'cache-control': 'max-age=0', 
     } 
     url = 'https://www.openrice.com/en/hongkong/r-kitchen-one-cafe-sha-tin-western-r483821' 
     yield scrapy.Request(url=url, headers=headers, callback=self.parse) 

    def parse(self, response): # response = request url ? 
     items = [] 
     jsonresponse = json.loads(response) 

Aber es funktioniert nicht, wie soll ich es ändern?

Antwort

4

Sie brauchen das script Element in der HTML-Quelle zu finden, extrahieren Text ist und nur dann laden mit json.loads():

script = response.xpath("//script[@type='application/ld+json']/text()").extract_first() 
json_data = json.loads(script) 
print(json_data) 

Hier, ich bin mit dem nicht so häufig application/ld+json die script ausfindig zu machen, aber es Es gibt viele andere Optionen - wie, suchen Sie das Skript mit etwas Text Sie wissen, dass es im Skript selbst ist:

//script[contains(., 'Restaurant')]