GitHub模擬登錄

參考書籍:python3網絡爬蟲開發與實戰     作者個人博客https://cuiqingcai.com/

需要的工具:requests庫puquery庫

概要:打開網頁然後模擬登錄,實際上是在客戶端生成了Cookies,而cookies裏面保存了SessionID的信息,登錄之後的後續請求都會攜帶生成後的Cookies發送給服務器。服務器就會根據Cookies判斷出對應的SessionID,進而找到會話。

開始:

1、第一張圖片是GitHub登錄界面,可以看到authenticity_token表單元素,該元素被隱藏起來呢,是一個Base64加密的字符串,因爲在Headers裏看不到該元素。第二張圖片是用賬號和密碼登錄後的,可以看到Form Data的表單信息,其中有authenticity_token表單元素,是一模一樣的。該元素在登錄賬號前就已經產生,每次登錄前該元素都會變化。

 

2、寫代碼,先將authenticity_token表單元素打印出來,能爬取到該元素才能進行後面的賬號登錄操作。可以看到能打印出該表單元素,爲什麼與上面的值不一樣,因爲點擊一次GitHub登錄界面,該表單元素就會變化一次。 

import requests
from pyquery import PyQuery as pq
#定義一個Login類,初始化一些變量
class Login(object):
    def __init__(self):
        self.headers = {
            'Host': 'github.com',
            'Referer': 'https://github.com/',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
        }
        self.login_url = 'https://github.com/login'       #GitHub登錄界面
        self.post_url = 'https://github.com/session'      #GitHub賬號密碼登錄後的界面
        #requests庫的Session,它可以幫助我們維持一個會話,而且可以自動處理Cookies
        self.session = requests.Session()
    #獲取初始的Cookies和authenticity_token
    def token(self):
        response = self.session.get(self.login_url, headers=self.headers)
        selector = pq(response.text)
        token = selector('input[name="authenticity_token"]').attr('value')
        return token
    #打印出authenticity_token表單信息
    def login(self):
        print(self.token())

if __name__ == '__main__':
    login = Login()
    login.login()

 

3、拿到了重要的表單信息,現在可以實現模擬登錄,爬取登錄後的信息,並且打印出來。這裏注意一下,看一下自己爬取打印出來的是GitHub登錄時的源代碼,還是登錄後的源代碼。pyquery庫是處理ajax動態加載的解析庫,會使用selector選擇器。

import requests
from pyquery import PyQuery as pq

#定義一個Login類,初始化一些變量
class Login(object):
    def __init__(self):
        self.headers = {
            'Host': 'github.com',
            'Referer': 'https://github.com/',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
        }
        self.login_url = 'https://github.com/login'         #GitHub登錄界面
        self.post_url = 'https://github.com/session'        #GitHub賬號密碼登錄後界面
        #requests庫的Session,它可以幫助我們維持一個會話,而且可以自動處理Cookies
        self.session = requests.Session()
    #獲取初始的Cookies和authenticity_token
    def token(self):
        response = self.session.get(self.login_url, headers=self.headers)
        selector = pq(response.text)
        token = selector('input[name="authenticity_token"]').attr('value')
        return token

    #構造一個表單,複製各個字段
    def login(self):
        print(self.token())
        post_data = {
            'ga_id': '1487034071.1569382557',
            'commit': 'Sign in',
            'utf8': '✓',
            'authenticity_token': self.token(),
            'login': '寫自己的賬號',
            'password': '寫自己的密碼',
            'webauthn-support': 'supported',
            'webauthn-iuvpaa-support': 'unsupported',
            'required_field_cab0': ' '
        }
        #用Session對象的post()方法模擬登錄即可,自動處理重定向信息,登錄成功直接跳轉到首頁,首頁會顯示源代碼信息,根據自己需求爬取相對應的數據
        response = self.session.post(self.post_url, data=post_data, headers=self.headers)
        if response.status_code == 200:
            print(response.text)

if __name__ == '__main__':        #運行程序,該代碼塊被執行
    login = Login()
    login.login()

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