2017-06-08 46 views
2

AJAXのウェブサイトを含むあらゆるタイプのウェブサイトからすべてのデータをクロールおよびスクレイプできる一般的なスクレーパーを作りたいと思います。私は広範囲にインターネットを検索しましたが、ScrapyとSplashが一緒にAJAX Webサイト(ページング、フォームデータ、およびページが表示される前にボタンをクリックすることを含む)をスクラップする方法を私に説明できる適切なリンクを見つけることができませんでした。私が紹介したすべてのリンクでは、JavascriptのWebサイトはSplashを使ってレンダリングすることができますが、Splashを使用してJS Webサイトをレンダリングする方法についてのチュートリアルや説明はありません。私はブラウザを使用することに関連したソリューションを提供しないでください(私はプログラムですべてをやりたい、ヘッドレスブラウザの提案は大歓迎です...しかし私はスプラッシュを使いたい)。ScrapyとSplashを使用してAJAXベースのウェブサイトをスクラップする方法は?

class FlipSpider(CrawlSpider): 
    name = "flip" 
    allowed_domains = ["www.amazon.com"] 

    start_urls = ['https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=mobile'] 

    rules = (Rule(LinkExtractor(), callback='lol', follow=True), 

    def parse_start_url(self,response): 

     yield scrapy.Request(response.url, self.lol, meta={'splash':{'endpoint':'render.html','args':{'wait': 5,'iframes':1,}}}) 

    def lol(self, response): 
     """ 
     Some code 
+1

[splash doc](https://github.com/scrapy-plugins/scrapy-splash#installation)に従ったことがありますか?あなたの問題は何ですか? –

+0

はい、私はしました。 Splashのドキュメントには、使用できるコマンドが記載されています。私はどのように動的コンテンツを取得するためにウェブサイトのjavascriptを実行するためにそれらを使用する方法を知りたいです... – Rohan

+0

スプラッシュについての特定の質問や問題がない場合は、私はコピーしませんドキュメントを貼り付け...あなたが参照するあなたはJavaScriptベースのWebサイトをクロールできるはずです。 –

答えて

0

あなたはのJavaScript機能を足すことで、それはあなたのページをレンダリングするとき、そのスクリプトを実行するためにスプラッシュを伝えることで、ckick、またはスクロールのように、行動をエミュレートすることができます。

少しexemple:

(ソース:splash doc

-- Get button element dimensions with javascript and perform mouse click. 
_script = """ 
function main(splash) 
    assert(splash:go(splash.args.url)) 
    local get_dimensions = splash:jsfunc([[ 
     function() { 
      var rect = document.getElementById('button').getClientRects()[0]; 
      return {"x": rect.left, "y": rect.top} 
     } 
    ]]) 
    splash:set_viewport_full() 
    splash:wait(0.1) 
    local dimensions = get_dimensions() 
    splash:mouse_click(dimensions.x, dimensions.y) 

    -- Wait split second to allow event to propagate. 
    splash:wait(0.1) 
    return splash:html() 
end 
""" 

あなたはページ内の要素を選択のJavaScript機能し、それにクリックを定義します

その後、requestと入力すると、を入力して"execute"に設定し、"lua_script": _scriptargsに追加します。

Exemple:

私がすることができませんでした:あなたはスプラッシュやページネーションの問題は以下の通りですhere

+0

ありがとう!良い説明。私はscrap + splashを使ってウェブページ上のすべてのjavascriptを実行できるかどうか疑問に思っていましたか? – Rohan

1

スプラッシュスクリプトに関するすべての情報を見つけるでしょう

def parse(self, response): 
    yield SplashRequest(response.url, self.parse_elem, 
         endpoint="execute", 
         args={"lua_source": _script}) 

productレスポンス形式の新しいWebページ(ページネーションリンクをクリックした後)を提供するLuaスクリプト。純粋なHTMLではありません。

私の解決方法は次のとおりです。リンクをクリックして、生成された新しいURLを抽出し、この新しいURLにクローラを誘導します。

だから、私は、ページネーションリンクを持つページに、私はLuaのスクリプト

def parse_categories(self, response): 
script = """ 
      function main(splash) 
       assert(splash:go(splash.args.url)) 
       splash:wait(1) 
       splash:runjs('document.querySelectorAll(".next-page")[0].click()') 
       splash:wait(1) 
       return splash:url() 
      end 
      """ 

とGET_URL機能

def get_url(self,response): 
    yield SplashRequest(url=response.body_as_unicode(), callback=self.parse_categories) 

私ができた。この方法は、以下で

yield SplashRequest(url=response.url, callback=self.get_url, endpoint="execute", args={'lua_source': script}) 

を実行します私の質問をループします。

あなたが新しいURLを期待していないのなら、あなたのLuaスクリプトは純粋なhtmlを生成することができます。これは私たちの正規表現(それは悪い)で動作する必要がありますが、これができました。

関連する問題