Scrapyを使用してWebページをクロールしています。必要な情報の一部は、特定のボタンをクリックしたときにポップアップ表示されます(もちろん、クリック後にHTMLコードにも表示されます)。
here のように、Scrapyはフォーム(ログインなど)を処理できることがわかりました。しかし、問題は記入するフォームがないため、私が必要とするものではないということです。
ボタンをクリックすると、必要な情報が表示されますか?
Mechanizeやlxmlなどの外部ライブラリを使用する必要がありますか?
Scrapyはjavascriptを解釈できません。
ページ上のjavascriptと絶対にやり取りする必要がある場合は、Seleniumを使用する必要があります。
Scrapyを使用している場合、問題の解決策はボタンの動作によって異なります。
以前に非表示にされたコンテンツを表示しているだけであれば、問題なくデータをスクレイピングできます。ブラウザに表示されなくても、HTMLはそのままです。
ボタンが押されたときにAJAXを介してコンテンツを動的に取得する場合、Firebugなどのツールを使用してボタンを押したときに送信されるHTTPリクエストを表示するのが最善です。そのURLから直接データを要求するだけです。
Mechanizeやlxmlなどの外部ライブラリを使用する必要がありますか?
JavaScriptを解釈する場合は、別のライブラリを使用する必要がありますが、これら2つのどちらも法案に適合しません。どちらもjavascriptについて何も知りません。セレンは、行くべき道です。
スクレイピングに取り組んでいるページのURLを提供できる場合は、ご覧ください。
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!'
JavaScriptを適切かつ完全に使用するには、完全なブラウザエンジンが必要です。これはWatir/WatiN/Seleniumなどでのみ可能です。