スクレイピーシミュレーションランディング
学習目標:
- アプリケーションリクエストオブジェクトのCookieパラメータの使用
- start_requests関数の役割を理解する
- アプリケーションはポストリクエストを作成して送信します
1.以前にシミュレートされたログイン方法を確認します
1.1リクエストモジュールはどのようにシミュレートされたログインを実装しますか?
- Cookieを使用してページを直接リクエストする
- URLアドレスを見つけて、Cookieを保存するための投稿リクエストを送信します
1.2セレンはどのようにログインをシミュレートしますか?
- 対応する入力タグを見つけ、テキストを入力して[ログイン]をクリックします
1.3Scrapyのシミュレートされた着陸
- クッキーを直接運ぶ
- URLアドレスを見つけて、Cookieを保存するための投稿リクエストを送信します
2. Scrapyは、ログインする必要のあるページを直接取得するためにCookieを伝送します
アプリケーションシナリオ
- クッキーの有効期限は非常に長く、一部の不規則なWebサイトで一般的です
- Cookieの有効期限が切れる前にすべてのデータを取得できます
- ログイン後にセレンを使用して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
注意:
- スクレイプのCookieはヘッダーに配置できません。リクエストを作成するときに、辞書形式のCookieを受け入れることができる特別なCookieパラメーターがあります。
- 設定で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アイデアの分析
-
投稿のURLアドレスを見つける:ログインボタンをクリックしてパケットをキャプチャし、URLアドレスをhttps://github.com/sessionとして見つけます。
-
リクエスト本文の法則を見つける:ポストリクエストのリクエスト本文を分析し、それに含まれるパラメータは前の応答にあります
-
ログインが成功したかどうか:個人のホームページをリクエストして、ユーザー名が含まれているかどうかを確認します
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の配信プロセスを確認できます。
概要
- start_urlsのURLアドレスは、処理のためにstart_requestに渡されます。必要に応じて、start_request関数を書き換えることができます。
- Cookieを使用して直接ログインする:CookieはCookieパラメータの受信にのみ渡すことができます
- crapy.Request()投稿リクエストを送信
これで終わりです。それがあなたを助け、好きでフォローすることを歓迎します、あなたの好きは私にとって非常に重要です