でScrapyドキュメント、Scrapyで認証されたセッションを使用する方法を説明するための次の例があります。
class LoginSpider(BaseSpider):
name = 'example.com'
start_urls = ['http://www.example.com/users/login.php']
def parse(self, response):
return [FormRequest.from_response(response,
formdata={'username': 'john', 'password': 'secret'},
callback=self.after_login)]
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
# continue scraping with authenticated session...
私はそれでうまくいきました、そしてそれは大丈夫です。しかし、私の質問は次のとおりcontinue scraping with authenticated session
です。最後の行のコメントで彼らが言うように、あなたは何をしなければなりませんか?
上記のコードで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)
したがって、リクエストが行われるたびに、ログインフォームが存在するかどうかの応答がチェックされます。存在する場合はログインする必要があることがわかっているため、関連する関数を呼び出します。存在しない場合は、応答からデータをスクレイピングする関数を呼び出します。
これが明確であることを願っています。他にご不明な点がございましたら、お気軽にお問い合わせください。
編集:
さて、あなたはただ一つのリクエストをスポーンしてそれをこするだけではありません。リンクをたどりたい。
そのためには、ページから関連リンクをスクレイピングし、それらの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
手動で行うのではなく、調べる必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加