2013-09-26 40 views
20

私はscrapyを使用してウェブサイトのスクレイプデータをスクリーニングしています。しかし、私が望むデータはHTML自体の中にではなく、代わりにjavascriptのものです。だから、私の質問は:スクラップ、JavaScript内のデータを廃棄する

このような場合の値(テキスト値)を取得する方法は?私が取得しようとしている https://www.mcdonalds.com.sg/locate-us/

属性: 住所、連絡先、営業時間

これは、私がスクリーンこすりしようとしているサイトです。

クロムブラウザ内で「右クリック」、「ソースの表示」を行うと、そのような値がHTMLで利用できないことがわかります。


編集

SRYポール、私は、あなたが私に言った何をしたadmin-ajax.phpを発見し、身体を見たが、私は本当に今、立ち往生しています。

jsonオブジェクトから値を取得し、それを自分自身の可変フィールドに格納するにはどうすればよいですか?大衆のためにただ1つの属性を行う方法と、治療を開始したばかりの人々を共有する方法を分かち合うことができれば、良いでしょう。ここに私のコードは、要するにので、どのように私は店行い、長い編集のために、これまで

Items.py

class McDonaldsItem(Item): 
name = Field() 
address = Field() 
postal = Field() 
hours = Field() 

McDonalds.py

from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 
import re 

from fastfood.items import McDonaldsItem 

class McDonaldSpider(BaseSpider): 
name = "mcdonalds" 
allowed_domains = ["mcdonalds.com.sg"] 
start_urls = ["https://www.mcdonalds.com.sg/locate-us/"] 

def parse_json(self, response): 

    js = json.loads(response.body) 
    pprint.pprint(js) 

SRYだ

私の属性にjson値?例えば

***アイテム[ 'アドレス'] = *どのように取得するために****

PS、ではない私は

を使用してCMDライン上でこれらのスクリプトを実行し、このことができますかどうかわからなく、ためにscream crawl mcdonalds -o McDonalds.json -t json(すべてのデータをjsonファイルに保存する)

私は感謝の気持ちで十分にストレスを感じることができません。私はあなたにこれのための時間を持っていなくても、それはあなたにこれを頼むのは無理です。

答えて

18

(私はscrapy-usersメーリングリストへの投稿ですが、それはshellコマンドの相互作用で答えを補完するよう、ポールの提案によって、私はそれをここに掲示しています。)

を一般的に、いくつかのデータの可視化をレンダリングするために、サードパーティのサービスを使用してウェブサイトを(マップ、テーブルなど)は何らかの形でデータを送信する必要があり、ほとんどの場合、このデータはブラウザからアクセス可能です。この場合の

、(つまり、ブラウザによって行われた要求を探索)検査は、データがそうPOSTリクエストからhttps://www.mcdonalds.com.sg/wp-admin/admin-ajax.php

にロードされていることを示し、基本的にあなたが素敵にしたいそこにすべてのデータを持っていますjsonフォーマットを使用する準備ができています。要するに

$ scrapy shell https://www.mcdonalds.com.sg/locate-us/ 
2013-09-27 00:44:14-0400 [scrapy] INFO: Scrapy 0.16.5 started (bot: scrapybot) 
... 

In [1]: from scrapy.http import FormRequest 

In [2]: url = 'https://www.mcdonalds.com.sg/wp-admin/admin-ajax.php' 

In [3]: payload = {'action': 'ws_search_store_location', 'store_name':'0', 'store_area':'0', 'store_type':'0'} 

In [4]: req = FormRequest(url, formdata=payload) 

In [5]: fetch(req) 
2013-09-27 00:45:13-0400 [default] DEBUG: Crawled (200) <POST https://www.mcdonalds.com.sg/wp-admin/admin-ajax.php> (referer: None) 
... 

In [6]: import json 

In [7]: data = json.loads(response.body) 

In [8]: len(data['stores']['listing']) 
Out[8]: 127 

In [9]: data['stores']['listing'][0] 
Out[9]: 
{u'address': u'678A Woodlands Avenue 6<br/>#01-05<br/>Singapore 731678', 
u'city': u'Singapore', 
u'id': 78, 
u'lat': u'1.440409', 
u'lon': u'103.801489', 
u'name': u"McDonald's Admiralty", 
u'op_hours': u'24 hours<br>\r\nDessert Kiosk: 0900-0100', 
u'phone': u'68940513', 
u'region': u'north', 
u'type': [u'24hrs', u'dessert_kiosk'], 
u'zip': u'731678'} 

Scrapyはクモを書き込む前に、ウェブサイトで思想家のは非常に便利ですshellコマンドを提供し、あなたのクモにあなたがコールバックでロードし、上記FormRequest(...)を返す必要がjsonオブジェクトをresponse.bodyから、最後に各ストアのデータをリストに入れます。data['stores']['listing']希望の値を持つアイテムを作成します。

このような何か:

class McDonaldSpider(BaseSpider): 
    name = "mcdonalds" 
    allowed_domains = ["mcdonalds.com.sg"] 
    start_urls = ["https://www.mcdonalds.com.sg/locate-us/"] 

    def parse(self, response): 
     # This receives the response from the start url. But we don't do anything with it. 
     url = 'https://www.mcdonalds.com.sg/wp-admin/admin-ajax.php' 
     payload = {'action': 'ws_search_store_location', 'store_name':'0', 'store_area':'0', 'store_type':'0'} 
     return FormRequest(url, formdata=payload, callback=self.parse_stores) 

    def parse_stores(self, response): 
     data = json.loads(response.body) 
     for store in data['stores']['listing']: 
      yield McDonaldsItem(name=store['name'], address=store['address']) 
+0

ヘルプのためのThx有益で有益! *私と同じ問題に直面している人には、この投稿をチェックアウトしてください* – HeadAboutToExplode

7

ブラウザでhttps://www.mcdonalds.com.sg/locate-us/を開くときは、「inspect」ツール(ChromeやFirefoxなどがあればうれしいです)を開き、[ネットワーク]タブを探します。

あなたはさらに、「XHR」のために(XMLHttpRequestの)イベントをフィルタすることができ、あなたはこの体で https://www.mcdonalds.com.sg/wp-admin/admin-ajax.phpPOST要求が表示されます
action=ws_search_store_location&store_name=0&store_area=0&store_type=0 

そのPOST要求に対する応答は、すべてでJSONオブジェクトであります

{u'flagicon': u'https://www.mcdonalds.com.sg/wp-content/themes/mcd/images/storeflag.png', 
u'stores': {u'listing': [{u'address': u'678A Woodlands Avenue 6<br/>#01-05<br/>Singapore 731678', 
          u'city': u'Singapore', 
          u'id': 78, 
          u'lat': u'1.440409', 
          u'lon': u'103.801489', 
          u'name': u"McDonald's Admiralty", 
          u'op_hours': u'24 hours<br>\r\nDessert Kiosk: 0900-0100', 
          u'phone': u'68940513', 
          u'region': u'north', 
          u'type': [u'24hrs', u'dessert_kiosk'], 
          u'zip': u'731678'}, 
          {u'address': u'383 Bukit Timah Road<br/>#01-09B<br/>Alocassia Apartments<br/>Singapore 259727', 
          u'city': u'Singapore', 
          u'id': 97, 
          u'lat': u'1.319752', 
          u'lon': u'103.827398', 
          u'name': u"McDonald's Alocassia", 
          u'op_hours': u'Daily: 0630-0100', 
          u'phone': u'68874961', 
          u'region': u'central', 
          u'type': [u'24hrs_weekend', 
            u'drive_thru', 
            u'mccafe'], 
          u'zip': u'259727'}, 

         ... 
          {u'address': u'60 Yishuan Avenue 4 <br/>#01-11<br/><br/>Singapore 769027', 
          u'city': u'Singapore', 
          u'id': 1036, 
          u'lat': u'1.423924', 
          u'lon': u'103.840628', 
          u'name': u"McDonald's Yishun Safra", 
          u'op_hours': u'24 hours', 
          u'phone': u'67585632', 
          u'region': u'north', 
          u'type': [u'24hrs', 
            u'drive_thru', 
            u'live_screening', 
            u'mccafe', 
            u'bday_party'], 
          u'zip': u'769027'}], 
      u'region': u'all'}} 
:あなたは

import json 
import pprint 
... 
class MySpider(BaseSpider): 
... 
    def parse_json(self, response): 

     js = json.loads(response.body) 
     pprint.pprint(js) 

のようなこの希望出力何かをしたい情報

私はあなたのフィールドを抽出するために残します。 FormRequest(中

)あなたは、おそらく追加する必要がScrapyで送る「X-要求-付きの:XMLHttpRequestの」ヘッダ(お使いのブラウザはあなたが検査ツールでリクエストヘッダを見ればことを送信します)

+0

速い答え! thx paul、2回目で私を助けました:DDD – HeadAboutToExplode

+0

よろしくお願いします。それが、SOのすべてです。共有し、助けてください。 –

+0

バンプが編集されました。もう少しアドバイスがありますか? – HeadAboutToExplode