web-dev-qa-db-ja.com

Scrapyのボタンをクリック

Scrapyを使用してWebページをクロールしています。必要な情報の一部は、特定のボタンをクリックしたときにポップアップ表示されます(もちろん、クリック後にHTMLコードにも表示されます)。

here のように、Scrapyはフォーム(ログインなど)を処理できることがわかりました。しかし、問題は記入するフォームがないため、私が必要とするものではないということです。

ボタンをクリックすると、必要な情報が表示されますか?

Mechanizeやlxmlなどの外部ライブラリを使用する必要がありますか?

37
naeg

Scrapyはjavascriptを解釈できません。

ページ上のjavascriptと絶対にやり取りする必要がある場合は、Seleniumを使用する必要があります。

Scrapyを使用している場合、問題の解決策はボタンの動作によって異なります。

以前に非表示にされたコンテンツを表示しているだけであれば、問題なくデータをスクレイピングできます。ブラウザに表示されなくても、HTMLはそのままです。

ボタンが押されたときにAJAXを介してコンテンツを動的に取得する場合、Firebugなどのツールを使用してボタンを押したときに送信されるHTTPリクエストを表示するのが最善です。そのURLから直接データを要求するだけです。

Mechanizeやlxmlなどの外部ライブラリを使用する必要がありますか?

JavaScriptを解釈する場合は、別のライブラリを使用する必要がありますが、これら2つのどちらも法案に適合しません。どちらもjavascriptについて何も知りません。セレンは、行くべき道です。

スクレイピングに取り組んでいるページのURLを提供できる場合は、ご覧ください。

44
Acorn

Seleniumブラウザは非常に素晴らしいソリューションを提供します。次に例を示します(pip install -U Selenium):

from Selenium import webdriver

class northshoreSpider(Spider):
    name = 'xxx'
    allowed_domains = ['www.example.org']
    start_urls = ['https://www.example.org']

    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self,response):
            self.driver.get('https://www.example.org/abc')

            while True:
                try:
                    next = self.driver.find_element_by_xpath('//*[@id="BTN_NEXT"]')
                    url = 'http://www.example.org/abcd'
                    yield Request(url,callback=self.parse2)
                    next.click()
                except:
                    break

            self.driver.close()

    def parse2(self,response):
        print 'you are here!'
13
Nima Soroush

JavaScriptを適切かつ完全に使用するには、完全なブラウザエンジンが必要です。これはWatir/WatiN/Seleniumなどでのみ可能です。

0
wRAR