1. 程式人生 > >【模擬登陸】github模擬登陸,列印資訊流

【模擬登陸】github模擬登陸,列印資訊流

目的:動態獲取cookie

第一:分析登陸過程

1、開啟開發者工具,檢視各自請求

2、可以看到name為session的請求【方式post,傳入的data】

3、檢視name為login的請求,原始碼中獲得token,作為上一個請求中的data的一部分

第二:登陸以後,解析頁面資訊流資料

 檢視資訊流請求的url,自行構建對應的url,解析

 1、這裡有個技巧    /div[@id=111]//text()  獲取div下面所以的text()

 2、正則的re.sub(' +',' ',str)實現多個空格替換成單獨一個空格

    def dd(self):
        para={
            'page': self.page,
            'utf8':'✓'
        }
        xml=self.xmlurl+ urlencode(para)
        res=self.session.get(xml,headers=self.heads)
        if res.status_code==200:
            sele=etree.HTML(res.text)
            dynamics=sele.xpath('//div[@class="d-flex flex-justify-between flex-items-baseline"]')
            print(dynamics)
            for i in dynamics:
                str=''.join(i.xpath('./div//text()')).replace('\n','')#一個div的所有[//]text()全部解析出來,然後構成一個類別,並把換行符替換
                str=re.sub(' +',' ',str)#多個空白字元,換成一個
                print(str)

第三:整體封裝成一個類方便呼叫

這裡重點關注類的__init__()初始設定的屬性,3個不同的url,當然和Session()會話的呼叫

from lxml import etree
import requests
from urllib.parse import urlencode
import re
class gitlogain():
    def __init__(self,page):
        self.heads={
            'Referer': 'https://github.com',
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 YaBrowser/18.6.1.770 Yowser/2.5 Safari/537.36',
            'Host':'github.com'
           }
        self.logainurl='https://github.com/login'
        self.posturl='https://github.com/session'
        self.session=requests.Session()
        self.page=page
        self.xmlurl='https://github.com/dashboard-feed?'

    def token(self):
        ruler=re.compile(r'name="authenticity_token" value="(.*)"./')
        auth=self.session.get(self.logainurl,headers=self.heads)
        z=auth.text
        authenticity_token=ruler.findall(z)
        print(authenticity_token[0])
        return authenticity_token[0]

    def login(self,email,password):
        post_data={
        'commit': 'Sign in',
        'utf8':'✓',
        'authenticity_token':self.token(),
        'login': email,
        'password': password
        }
        ss=self.session.post(self.posturl,headers=self.heads,data=post_data)
        if ss.status_code==200:
            self.dd()

    def dd(self):
        para={
            'page': self.page,
            'utf8':'✓'
        }
        xml=self.xmlurl+ urlencode(para)
        res=self.session.get(xml,headers=self.heads)
        if res.status_code==200:
            sele=etree.HTML(res.text)
            dynamics=sele.xpath('//div[@class="d-flex flex-justify-between flex-items-baseline"]')
            print(dynamics)
            for i in dynamics:
                str=''.join(i.xpath('./div//text()')).replace('\n','')#一個div的所有[//]text()全部解析出來,然後構成一個類別,並把換行符替換
                str=re.sub(' +',' ',str)#多個空白字元,換成一個
                print(str)