エントリから放棄2までのスクレイピー-シミュレートされたログイン

スクレイピーシミュレーションランディング

ここに写真の説明を挿入

学習目標:
  1. アプリケーションリクエストオブジェクトのCookieパラメータの使用
  2. start_requests関数の役割を理解する
  3. アプリケーションはポストリクエストを作成して送信します

1.以前にシミュレートされたログイン方法を確認します

1.1リクエストモジュールはどのようにシミュレートされたログインを実装しますか?

  1. Cookieを使用してページを直接リクエストする
  2. URLアドレスを見つけて、Cookieを保存するための投稿リクエストを送信します

1.2セレンはどのようにログインをシミュレートしますか?

  1. 対応する入力タグを見つけ、テキストを入力して[ログイン]をクリックします

1.3Scrapyのシミュレートされた着陸

  1. クッキーを直接運ぶ
  2. URLアドレスを見つけて、Cookieを保存するための投稿リクエストを送信します

2. Scrapyは、ログインする必要のあるページを直接取得するためにCookieを伝送します

アプリケーションシナリオ
  1. クッキーの有効期限は非常に長く、一部の不規則なWebサイトで一般的です
  2. Cookieの有効期限が切れる前にすべてのデータを取得できます
  3. ログイン後にセレンを使用してCookieを取得してローカルに保存するなど、他のプログラムと協力し、scrapyがリクエストを送信する前にローカルCookieを読み取ります。

2.1実装:scrapyのstarte_rquestsメソッドをリファクタリングします

スクレイプのstart_urlはstart_requestsで処理され、実装コードは次のとおりです。

# 这是源代码
def start_requests(self):
    cls = self.__class__
    if method_is_overridden(cls, Spider, 'make_requests_from_url'):
        warnings.warn(
            "Spider.make_requests_from_url method is deprecated; it "
            "won't be called in future Scrapy releases. Please "
            "override Spider.start_requests method instead (see %s.%s)." % (
                cls.__module__, cls.__name__
            ),
        )
        for url in self.start_urls:
            yield self.make_requests_from_url(url)
    else:
        for url in self.start_urls:
            yield Request(url, dont_filter=True)

したがって、それに応じて、start_urlアドレスのurlがログイン後にアクセスできるurlアドレスである場合は、start_requestメソッドを書き直して、手動でCookieを追加する必要があります。

2.2Cookieを使用してgithubにログインします

テストアカウントnoobpythonerzhoudawei123

import scrapy
import re

class Login1Spider(scrapy.Spider):
    name = 'login1'
    allowed_domains = ['github.com']
    start_urls = ['https://github.com/NoobPythoner'] # 这是一个需要登陆以后才能访问的页面

    def start_requests(self): # 重构start_requests方法
        # 这个cookies_str是抓包获取的
        cookies_str = '...' # 抓包获取
        # 将cookies_str转换为cookies_dict
        cookies_dict = {
    
    i.split('=')[0]:i.split('=')[1] for i in cookies_str.split('; ')}
        yield scrapy.Request(
            self.start_urls[0],
            callback=self.parse,
            cookies=cookies_dict
        )

    def parse(self, response): # 通过正则表达式匹配用户名来验证是否登陆成功
        # 正则匹配的是github的用户名
        result_list = re.findall(r'noobpythoner|NoobPythoner', response.body.decode()) 
        print(result_list)
        pass
注意:
  1. スクレイプのCookieはヘッダーに配置できません。リクエストを作成するときに、辞書形式のCookieを受け入れることができる特別なCookieパラメーターがあります。
  2. 設定でROBOTSプロトコル、USER_AGENTを設定します

3.scrapy.Requestが投稿リクエストを送信します

投稿リクエストを送信するには、scrapy.Request()を使用してメソッドと本文のパラメーターを指定できますが、通常、scrapy.FormRequest()を使用して投稿リクエストを送信します。

3.1投稿リクエストを送信する

注:scrapy.FormRequest()はフォームとajaxリクエストを送信できます。https://www.jb51.net/article/146769.htmを参照してください。

3.1.1アイデアの分析
  1. 投稿のURLアドレスを見つける:ログインボタンをクリックしてパケットをキャプチャし、URLアドレスをhttps://github.com/sessionとして見つけます。

  2. リクエスト本文の法則を見つける:ポストリクエストのリクエスト本文を分析し、それに含まれるパラメータは前の応答にあります

  3. ログインが成功したかどうか:個人のホームページをリクエストして、ユーザー名が含まれているかどうかを確認します

3.1.2コードは次のように実装されます。
import scrapy
import re

class Login2Spider(scrapy.Spider):
   name = 'login2'
   allowed_domains = ['github.com']
   start_urls = ['https://github.com/login']

   def parse(self, response):
       authenticity_token = response.xpath("//input[@name='authenticity_token']/@value").extract_first()
       utf8 = response.xpath("//input[@name='utf8']/@value").extract_first()
       commit = response.xpath("//input[@name='commit']/@value").extract_first()
        
        #构造POST请求,传递给引擎
       yield scrapy.FormRequest(
           "https://github.com/session",
           formdata={
               "authenticity_token":authenticity_token,
               "utf8":utf8,
               "commit":commit,
               "login":"noobpythoner",
               "password":"***"
           },
           callback=self.parse_login
       )

   def parse_login(self,response):
       ret = re.findall(r"noobpythoner|NoobPythoner",response.text)
       print(ret)
チップ

settings.pyでCOOKIES_DEBUG = TRUEを設定すると、ターミナルでCookieの配信プロセスを確認できます。


概要

  1. start_urlsのURLアドレスは、処理のためにstart_requestに渡されます。必要に応じて、start_request関数を書き換えることができます。
  2. Cookieを使用して直接ログインする:CookieはCookieパラメータの受信にのみ渡すことができます
  3. crapy.Request()投稿リクエストを送信

これで終わりです。それがあなたを助け、好きでフォローすることを歓迎します、あなたの好きは私にとって非常に重要です

おすすめ

転載: blog.csdn.net/qq_45176548/article/details/111991111