64

Scrapy docsには、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次のとおりです。最後の行のコメントで彼らが言うように、あなたは何をしなければなりませんか?

4

1 に答える 1

72

上記のコードで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手動で行うのではなく、調べる必要があります。

于 2011-05-01T19:54:12.437 に答える