最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python3以GitHub為例來實(shí)現(xiàn)模擬登錄和爬取的實(shí)例講解

 更新時(shí)間:2020年07月30日 14:32:08   作者:愛喝馬黛茶的安東尼  
在本篇內(nèi)容里小編給大家分享的是關(guān)于Python3以GitHub為例來實(shí)現(xiàn)模擬登錄和爬取的實(shí)例講解,需要的朋友們可以參考下。

我們先以一個(gè)最簡(jiǎn)單的實(shí)例來了解模擬登錄后頁面的抓取過程,其原理在于模擬登錄后 Cookies 的維護(hù)。

1. 本節(jié)目標(biāo)

本節(jié)將講解以 GitHub 為例來實(shí)現(xiàn)模擬登錄的過程,同時(shí)爬取登錄后才可以訪問的頁面信息,如好友動(dòng)態(tài)、個(gè)人信息等內(nèi)容。

我們應(yīng)該都聽說過 GitHub,如果在我們?cè)?Github 上關(guān)注了某些人,在登錄之后就會(huì)看到他們最近的動(dòng)態(tài)信息,比如他們最近收藏了哪個(gè) Repository,創(chuàng)建了哪個(gè)組織,推送了哪些代碼。但是退出登錄之后,我們就無法再看到這些信息。

如果希望爬取 GitHub 上所關(guān)注人的最近動(dòng)態(tài),我們就需要模擬登錄 GitHub。

2. 環(huán)境準(zhǔn)備

請(qǐng)確保已經(jīng)安裝好了 requests 和 lxml 庫,如沒有安裝可以參考第 1 章的安裝說明。

3. 分析登錄過程

首先要分析登錄的過程,需要探究后臺(tái)的登錄請(qǐng)求是怎樣發(fā)送的,登錄之后又有怎樣的處理過程。

如果已經(jīng)登錄 GitHub,先退出登錄,同時(shí)清除 Cookies。

打開 GitHub 的登錄頁面,鏈接為 https://github.com/login,輸入 GitHub 的用戶名和密碼,打開開發(fā)者工具,將 Preserve Log 選項(xiàng)勾選上,這表示顯示持續(xù)日志,如圖 10-1 所示。

91e7023624e2611b3668a3aca0caafe.png

點(diǎn)擊登錄按鈕,這時(shí)便會(huì)看到開發(fā)者工具下方顯示了各個(gè)請(qǐng)求過程,如圖 10-2 所示。

0bc56535ecbf81cee9ddf9f2e316972.png

點(diǎn)擊第一個(gè)請(qǐng)求,進(jìn)入其詳情頁面,如圖 10-3 所示。

64c91fd7943d08dbccdf9414dc74fdd.png

可以看到請(qǐng)求的 URL 為 https://github.com/session,請(qǐng)求方式為 POST。再往下看,我們觀察到它的 Form Data 和 Headers 這兩部分內(nèi)容,如圖 10-4 所示。

37c301a10fa421f76da6fdc24fe07c2.png

Headers 里面包含了 Cookies、Host、Origin、Referer、User-Agent 等信息。Form Data 包含了 5 個(gè)字段,commit 是固定的字符串 Sign in,utf8 是一個(gè)勾選字符,authenticity_token 較長(zhǎng),其初步判斷是一個(gè) Base64 加密的字符串,login 是登錄的用戶名,password 是登錄的密碼。

綜上所述,我們現(xiàn)在無法直接構(gòu)造的內(nèi)容有 Cookies 和 authenticity_token。下面我們?cè)賮硖綄ひ幌逻@兩部分內(nèi)容如何獲取。

在登錄之前我們會(huì)訪問到一個(gè)登錄頁面,此頁面是通過 GET 形式訪問的。輸入用戶名密碼,點(diǎn)擊登錄按鈕,瀏覽器發(fā)送這兩部分信息,也就是說 Cookies 和 authenticity_token 一定是在訪問登錄頁的時(shí)候設(shè)置的。

這時(shí)再退出登錄,回到登錄頁,同時(shí)清空 Cookies,重新訪問登錄頁,截獲發(fā)生的請(qǐng)求,如圖 10-5 所示。

e6b25f12cfe99beccbfd757a37e13c0.png

訪問登錄頁面的請(qǐng)求如圖所示,Response Headers 有一個(gè) Set-Cookie 字段。這就是設(shè)置 Cookies 的過程。

另外,我們發(fā)現(xiàn) Response Headers 沒有和 authenticity_token 相關(guān)的信息,所以可能 authenticity_token 還隱藏在其他的地方或者是計(jì)算出來的。我們?cè)購木W(wǎng)頁的源碼探尋,搜索相關(guān)字段,發(fā)現(xiàn)源代碼里面隱藏著此信息,它是一個(gè)隱藏式表單元素,如圖 10-6 所示。

2976eced3cc1d5d2e482545f0bf4200.png

現(xiàn)在我們已經(jīng)獲取到所有信息,接下來實(shí)現(xiàn)模擬登錄。

4. 代碼實(shí)戰(zhàn)

首先我們定義一個(gè) Login 類,初始化一些變量:

class Login(object):
    def __init__(self):
        self.headers = {
            'Referer': 'https://github.com/',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 
            Chrome/57.0.2987.133 Safari/537.36',
            'Host': 'github.com'
        }
        self.login_url = 'https://github.com/login'
        self.post_url = 'https://github.com/session'
        self.logined_url = 'https://github.com/settings/profile'
        self.session = requests.Session()

這里最重要的一個(gè)變量就是 requests 庫的 Session,它可以幫助我們維持一個(gè)會(huì)話,而且可以自動(dòng)處理 Cookies,我們不用再去擔(dān)心 Cookies 的問題。

接下來,訪問登錄頁面要完成兩件事:一是通過此頁面獲取初始的 Cookies,二是提取出 authenticity_token。

在這里我們實(shí)現(xiàn)一個(gè) token() 方法,如下所示:

from lxml import etree
def token(self):
    response = self.session.get(self.login_url, headers=self.headers)
    selector = etree.HTML(response.text)
    token = selector.xpath('//div/input[2]/@value')[0]
    return token

我們用 Session 對(duì)象的 get() 方法訪問 GitHub 的登錄頁面,然后用 XPath 解析出登錄所需的 authenticity_token 信息并返回。

現(xiàn)在已經(jīng)獲取初始的 Cookies 和 authenticity_token,開始模擬登錄,實(shí)現(xiàn)一個(gè) login() 方法,如下所示:

def login(self, email, password):
    post_data = {
        'commit': 'Sign in',
        'utf8': '✓',
        'authenticity_token': self.token(),
        'login': email,
        'password': password
    }
    response = self.session.post(self.post_url, data=post_data, headers=self.headers)
    if response.status_code == 200:
        self.dynamics(response.text)
    response = self.session.get(self.logined_url, headers=self.headers)
    if response.status_code == 200:
        self.profile(response.text)

首先構(gòu)造一個(gè)表單,復(fù)制各個(gè)字段,其中 email 和 password 是以變量的形式傳遞。然后再用 Session 對(duì)象的 post() 方法模擬登錄即可。由于 requests 自動(dòng)處理了重定向信息,我們登錄成功后就可以直接跳轉(zhuǎn)到首頁,首頁會(huì)顯示所關(guān)注人的動(dòng)態(tài)信息,得到響應(yīng)之后我們用 dynamics() 方法來對(duì)其進(jìn)行處理。接下來再用 Session 對(duì)象請(qǐng)求個(gè)人詳情頁,然后用 profile() 方法來處理個(gè)人詳情頁信息。

其中,dynamics() 方法和 profile() 方法的實(shí)現(xiàn)如下所示:

def dynamics(self, html):
    selector = etree.HTML(html)
    dynamics = selector.xpath('//div[contains(@class, "news")]//div[contains(@class, "alert")]')
    for item in dynamics:
        dynamic = ' '.join(item.xpath('.//div[@class="title"]//text()')).strip()
        print(dynamic)
def profile(self, html):
    selector = etree.HTML(html)
    name = selector.xpath('//input[@id="user_profile_name"]/@value')[0]
    email = selector.xpath('//select[@id="user_profile_email"]/option[@value!=""]/text()')
    print(name, email)

在這里,我們?nèi)匀皇褂?XPath 對(duì)信息進(jìn)行提取。在 dynamics() 方法里,我們提取了所有的動(dòng)態(tài)信息,然后將其遍歷輸出。在 prifile() 方法里,我們提取了個(gè)人的昵稱和綁定的郵箱,然后將其輸出。

這樣,整個(gè)類的編寫就完成了。

5. 運(yùn)行

我們新建一個(gè) Login 對(duì)象,然后運(yùn)行程序,如下所示:

if __name__ == "__main__":
    login = Login()
    login.login(email='cqc@cuiqingcai.com', password='password')

在 login() 方法傳入用戶名和密碼,實(shí)現(xiàn)模擬登錄。

可以看到控制臺(tái)有類似如下輸出:

GrahamCampbell  starred  nunomaduro/zero-framework
GrahamCampbell  starred  nunomaduro/laravel-zero
happyAnger6  created repository  happyAnger6/nodejs_chatroom
viosey  starred  nitely/Spirit
lbgws2  starred  Germey/TaobaoMM
EasyChris  starred  ageitgey/face_recognition
callmewhy  starred  macmade/GitHubUpdates
sindresorhus  starred  sholladay/squatter
SamyPesse  starred  graphcool/chromeless
wbotelhos  starred  tkadlec/grunt-perfbudget
wbotelhos  created repository  wbotelhos/eggy
leohxj  starred  MacGesture/MacGesture
GrahamCampbell  starred  GrahamCampbell/Analyzer
EasyChris  starred  golang/go
mitulgolakiya  starred  veltman/flubber
liaoyuming  pushed to  student  at  Germey/SecurityCourse
leohxj  starred  jasonslyvia/a-cartoon-intro-to-redux-cn
ruanyf  starred  ericchiang/pup
ruanyf  starred  bpesquet/thejsway
louwailou  forked  Germey/ScrapyTutorial  to  louwailou/ScrapyTutorial
Lving  forked  shadowsocksr-backup/shadowsocksr  to  Lving/shadowsocksr
qifuren1985  starred  Germey/ADSLProxyPool
QWp6t  starred  laravel/framework
Germey ['1016903103@qq.com', 'cqc@cuiqingcai.com']

可以發(fā)現(xiàn),我們成功獲取到關(guān)注的人的動(dòng)態(tài)信息和個(gè)人的昵稱及綁定郵箱。模擬登錄成功!

6. 本節(jié)代碼

本節(jié)代碼地址:https://github.com/Python3WebSpider/GithubLogin

7. 結(jié)語

我們利用 requests 的 Session 實(shí)現(xiàn)了模擬登錄操作,其中最重要的還是分析思路,只要各個(gè)參數(shù)都成功獲取,那么模擬登錄是沒有問題的。

登錄成功,這就相當(dāng)于建立了一個(gè) Session 會(huì)話,Session 對(duì)象維護(hù)著 Cookies 的信息,直接請(qǐng)求就會(huì)得到模擬登錄成功后的頁面。

以上就是Python3以GitHub為例來實(shí)現(xiàn)模擬登錄和爬取的實(shí)例講解的詳細(xì)內(nèi)容,更多關(guān)于Python3爬蟲以GitHub為例來實(shí)現(xiàn)模擬登錄和爬取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python之Class&Object用法詳解

    Python之Class&Object用法詳解

    今天小編就為大家分享一篇Python之Class&Object用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python將字符串常量轉(zhuǎn)化為變量方法總結(jié)

    Python將字符串常量轉(zhuǎn)化為變量方法總結(jié)

    在本篇內(nèi)容里我們給大家整理了一篇關(guān)于Python將字符串常量轉(zhuǎn)化為變量方法的知識(shí)點(diǎn)總結(jié),有需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • Python切片操作實(shí)例分析

    Python切片操作實(shí)例分析

    這篇文章主要介紹了Python切片操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python切片相關(guān)的正向、反向、步長(zhǎng)等使用技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2018-03-03
  • Python 給我一個(gè)鏈接西瓜視頻隨便下載爬蟲

    Python 給我一個(gè)鏈接西瓜視頻隨便下載爬蟲

    這篇文章主要介紹了Python通過一個(gè)鏈接爬取西瓜視頻,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • python環(huán)境配置方式(服務(wù)器+本地)

    python環(huán)境配置方式(服務(wù)器+本地)

    這篇文章詳細(xì)介紹了在服務(wù)器上安裝和配置Anaconda3、TensorFlow、PyTorch等深度學(xué)習(xí)環(huán)境的步驟,包括下載、初始化、創(chuàng)建環(huán)境、驗(yàn)證安裝以及解決一些常見問題
    2025-01-01
  • Django與數(shù)據(jù)庫交互的實(shí)現(xiàn)

    Django與數(shù)據(jù)庫交互的實(shí)現(xiàn)

    最近在學(xué)習(xí)Django,本文主要介紹了Django與數(shù)據(jù)庫交互的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • python 字符串格式化代碼

    python 字符串格式化代碼

    python 字符串格式化代碼,需要的朋友可以參考一下
    2013-03-03
  • 解決TypeError: Object of type xxx is not JSON serializable錯(cuò)誤問題

    解決TypeError: Object of type xxx is&

    這篇文章主要介紹了解決TypeError: Object of type xxx is not JSON serializable錯(cuò)誤問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 利用Python腳本在Nginx和uwsgi上部署MoinMoin的教程

    利用Python腳本在Nginx和uwsgi上部署MoinMoin的教程

    這篇文章主要介紹了利用Python腳本在Nginx和uwsgi上部署MoinMoin的教程,示例基于CentOS操作系統(tǒng),需要的朋友可以參考下
    2015-05-05
  • python中如何使用insert函數(shù)

    python中如何使用insert函數(shù)

    這篇文章主要介紹了python中如何使用insert函數(shù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論

连州市| 定州市| 湾仔区| 汝阳县| 西盟| 唐海县| 平遥县| 上栗县| 邳州市| 苗栗市| 石阡县| 原阳县| 崇阳县| 云安县| 诸暨市| 宝山区| 宜川县| 仙桃市| 玉门市| 马边| 伊宁市| 余江县| 肃南| 德钦县| 郓城县| 金阳县| 上高县| 普宁市| 安西县| 保定市| 奉新县| 长沙市| 湾仔区| 达尔| 长岭县| 泰和县| 苍山县| 堆龙德庆县| 怀化市| 清丰县| 山东省|