上記のコードでFormRequest
は、認証に使用されている のafter_login
コールバックとして関数が設定されています。これは、after_login
関数が呼び出され、ログイン試行で取得したページが応答として渡されることを意味します。
次に、特定の文字列 (この場合は"authentication failed"
. 見つかった場合、スパイダーは終了します。
ここまで来ると、スパイダーは認証に成功したことを認識し、新しいリクエストの生成やデータのスクレイピングを開始できます。したがって、この場合は次のようになります。
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
# ...
def after_login(self, response):
# check login succeed before going on
if "authentication failed" in response.body:
self.log("Login failed", level=log.ERROR)
return
# We've successfully authenticated, let's have some fun!
else:
return Request(url="http://www.example.com/tastypage/",
callback=self.parse_tastypage)
def parse_tastypage(self, response):
hxs = HtmlXPathSelector(response)
yum = hxs.select('//img')
# etc.
ここを見ると、スクレイピングの前に認証を行うスパイダーの例があります。
この場合、parse
関数内の処理を行います (すべてのリクエストのデフォルトのコールバック)。
def parse(self, response):
hxs = HtmlXPathSelector(response)
if hxs.select("//form[@id='UsernameLoginForm_LoginForm']"):
return self.login(response)
else:
return self.get_section_links(response)
そのため、要求が行われるたびに、ログイン フォームの存在について応答がチェックされます。存在する場合は、ログインする必要があることがわかっているので、関連する関数を呼び出します。存在しない場合は、応答からデータをスクレイピングする関数を呼び出します。
ご不明な点がございましたら、お気軽にお問い合わせください。
編集:
1 つのリクエストを生成してスクレイピングするだけではありません。リンクをたどりたい。
そのために必要なことは、ページから関連するリンクをスクレイピングし、それらの URL を使用してリクエストを生成することだけです。例えば:
def parse_page(self, response):
""" Scrape useful stuff from page, and spawn new requests
"""
hxs = HtmlXPathSelector(response)
images = hxs.select('//img')
# .. do something with them
links = hxs.select('//a/@href')
# Yield a new request for each link we found
for link in links:
yield Request(url=link, callback=self.parse_page)
ご覧のとおり、ページ上のすべての URL に対して新しいリクエストが生成され、それらのリクエストのそれぞれが、レスポンスで同じ関数を呼び出すため、再帰的なスクレイピングが行われます。
上に書いたことはほんの一例です。ページを「クロール」したい場合は、CrawlSpider
手動で行うのではなく、調べる必要があります。