使用scrapy進行模擬登陸三種方式

scrapy有三種方法模擬登陸方式:

- 直接攜帶cookies
- 找url地址,發送post請求存儲cookie
- 找到對應的form表單,自動解析input標籤,自動解析post請求的url地址,自動帶上數據,自動發送請求

1、攜帶cookies登陸github

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): # 通過正則表達式匹配用戶名來驗證是否登陸成功
        result_list = re.findall(r'noobpythoner|NoobPythoner', response.body.decode())
        print(result_list)
        pass

注意:

  • scrapy中cookie不能夠放在headers中,在構造請求的時候有專門的cookies參數,能夠接受字典形式的coookie
  • 在setting中設置ROBOTS協議、USER_AGENT

2、使用scrapy.FormRequest()登錄

通過scrapy.FormRequest能夠發送post請求,同時需要添加fromdata參數作爲請求體,以及callback

 yield scrapy.FormRequest(
             "https://github.com/session",
             formdata={
                 "authenticity_token":authenticity_token,
                 "utf8":utf8,
                 "commit":commit,
                 "login":"****",
                 "password":"****"
             },
             callback=self.parse_login
         )

3、使用scrapy.Formrequest.from_response登陸github

import scrapy
import re

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

    def parse(self, response):
        yield scrapy.FormRequest.from_response(
            response, # 傳入response對象,自動解析
            # 可以通過xpath來定位form表單,當前頁只有一個form表單時,將會自動定位
            formxpath='//*[@id="login"]/form', 
            formdata={'login': '****', 'password': '***'},
            callback=self.parse_login
        )

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章