スクレイプのstart_urlはstart_requestsで処理され、実装コードは次のとおりです。
# これはソースコードです
def start_requests(self):
cls = self.__class__
ifmethod_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:yieldRequest(url, dont_filter=True)
したがって、それに応じて、start_urlアドレスのurlがログイン後にアクセスできるurlアドレスである場合は、start_requestメソッドを書き直して、手動でCookieを追加する必要があります
テストアカウントnoobpythonerzhoudawei123
import scrapy
import re
classLogin1Spider(scrapy.Spider):
name ='login1'
allowed_domains =['github.com']
start_urls =['https://github.com/NoobPythoner'] #ログイン後にアクセスできるページです
def start_requests(self): #リファクター開始_リクエストメソッド
# このクッキー_strはキャプチャによって取得されます
cookies_str ='...' #キャプチャー
# クッキー_strはcookieに変換されます_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
メソッドと本体のパラメーターをscrapy.Request()で指定して投稿リクエストを送信できることはわかっていますが、scrapy.FormRequest()は通常投稿リクエストを送信するために使用されます
注:scrapy.FormRequest()はフォームとajaxリクエストを送信できます。https://www.jb51.net/article/146769.htmを参照してください。
投稿のURLアドレスを見つける:ログインボタンをクリックしてパケットをキャプチャし、URLアドレスをhttps://github.com/sessionとして見つけます。
リクエスト本文の法則を見つける:ポストリクエストのリクエスト本文を分析し、それに含まれるパラメータは前の応答にあります
ログインが成功したかどうか:個人のホームページをリクエストして、ユーザー名が含まれているかどうかを確認します
import scrapy
import re
classLogin2Spider(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の配信プロセスを確認できます。
Recommended Posts