4

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

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
       """
4

3 に答える 3

1

JavaScript関数を記述し、Splash がページをレンダリングするときにそのスクリプトを実行するように指示することで、 ckickscrollなどの動作をエミュレートできます。

ちょっとした例:

ページ内の要素を選択してクリックするJavaScript関数を定義します。

(ソース:スプラッシュ ドキュメント)

# 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
"""

次に、requestを変更してendpointに設定し、args"execute"に追加します。"lua_script": _script

例:

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

スプラッシュ スクリプト に関するすべての情報がここにあります。

于 2017-06-08T13:31:56.630 に答える