Scrapy はクローリング プロセス中にどのように自動的にログインしますか?
Web サイトのデータをクロールする場合、一部の Web サイトでは、特定のページを閲覧したり、追加のデータを取得したりするためにユーザーのログイン認証が必要になります。同時に、ログイン後にのみ取得できる一部のデータについては、クローラ エンジニアが自動操作を使用して Web サイトへのログインをシミュレートし、クローラ データを収集することがよくあります。この記事では、Scrapy に自動ログイン機能を実装する方法を詳しく説明します。
新しいスパイダーを作成し、「login_spider」という名前を付けます。このスパイダーの目的は、シミュレートされたログイン作業を完了すること、つまり、クローラーが開始する前にユーザーのログイン作業を完了することです。
ログイン ページでフォームを見つけて、フォームの HTML コードを表示します。
「ユーザー名」、「パスワード」など、入力する必要があるフィールド (name 属性) を見つけてコピーします。
Selector メソッドを使用してこれらのフィールドに対応する入力タグを検索し、extract() メソッドを使用して値を取得し、対応するキー値に割り当てます。
def parse(self,response): return scrapy.FormRequest.from_response( response, formdata={'username': 'your_username', 'password': 'your_password'}, callback=self.start_scraping )
ここでのログイン コールバック関数が行うことは、ログイン トークン値を含む応答を通じて Cookie を取得することです。新しい Request オブジェクトを構築し、後続のビジネス スパイダーで使用するために Cookie (ヘッダー) 値を渡します。
def start_scraping(self, response): # Get CSRF token token = response.css('input[name="csrf_token"]::attr(value)').extract_first() logging.info('CSRF token obtained: ' + token) # Create cookie dict cookie = response.headers.getlist('Set-Cookie') cookie = [str(c, 'utf-8') for c in cookie] cookie_dict = { str(c.split('; ')[0].split('=')[0]): str(c.split('; ')[0].split('=')[1]) for c in cookie } # Store cookie dict in spider settings self.settings.set('COOKIE_DICT', cookie_dict, priority='cmdline') # Start scraping main website yield scrapy.Request( url='https://www.example.com/your/start/url/', callback=self.parse_homepage, headers={'Cookie': cookie} )
スパイダーにログインした後、start_requests メソッドを呼び出して最初のリクエストを送信します。前の手順で保存した cookie_dict の値を設定から取得し、headers パラメーターを使用してクローラーに渡します。
def start_requests(self): cookie = self.settings.get('COOKIE_DICT') yield scrapy.Request( url='https://www.example.com/your/start/url/', callback=self.parse_homepage, headers={'Cookie': cookie}, meta={'login': True} )
ログイン後、Cookie 情報を使用して実際の目的のページにアクセスします。ビジネス スパイダーのカスタマイズでは、Cookie 情報を取得する必要があるすべての関連 URL に Cookie 情報を使用してアクセスします。以下は簡単なビジネス スパイダー コードです。
class MySpider(scrapy.Spider): name = 'myspider' def start_requests(self): yield scrapy.Request('https://www.example.com/real-target-url/', callback=self.parse, headers={'Cookie': self.settings.get('COOKIE_DICT')}) def parse(self, response): # Do whatever you want with the authenticated response
上記の手順により、Scrapy フレームワークを使用してシミュレートされたログイン機能を実装できます。 Cookie 値を保持することにより、Scrapy はログアウトせずにログイン検証が必要なデータをキャプチャし続けることができます。そうすることでセキュリティ上の問題が発生する可能性がありますが、この解決策は、クローラーを学習し、学術目的で研究を行う場合には実行可能です。
以上がScrapy はクローリング プロセス中にどのように自動的にログインしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。