成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

超詳細(xì)的Python實(shí)現(xiàn)新浪微博模擬登陸(小白都能懂)

Aldous / 615人閱讀

摘要:可能有的老手覺得我寫得很啰嗦,但其實(shí)很多新手可能都不知道這些細(xì)節(jié),所以我把我在分析新浪微博模擬登陸的過程全寫了出來。

這篇文章于去年4月發(fā)布在我的簡(jiǎn)書,現(xiàn)在把它放到這里,主要是為了宣傳自己的分布式微博爬蟲。下面是主要內(nèi)容,希望能幫到有這個(gè)需求的朋友


最近由于需要一直在研究微博的爬蟲,第一步便是模擬登陸,從開始摸索到走通模擬登陸這條路其實(shí)還是挺艱難的,需要一定的經(jīng)驗(yàn),為了讓朋友們以后少走點(diǎn)彎路,這里我把我的分析過程和代碼都附上來。

首先,我們先用正常的賬號(hào)登陸,具體看會(huì)有些什么請(qǐng)求。這里我用的是Http Analyzer抓包(Filders也是一個(gè)不錯(cuò)的選擇)。下面是正常登陸流程的截圖:


接下來我會(huì)詳細(xì)說明各個(gè)過程。

第一步:預(yù)登陸。

現(xiàn)在微博、空間等大型網(wǎng)站在輸入用戶名后基本都會(huì)做編碼或者加密處理,這里在用戶名輸入框輸入我的賬號(hào),通過抓包工具可以看到服務(wù)器會(huì)返回一段字符串:

這一步就是預(yù)登陸過程,同學(xué)們可以自己試試。登陸的時(shí)候我們需要用到其中的servertime、nonce、pubkey等字段。當(dāng)然這個(gè)不是我自己猜想的,后面的步驟會(huì)做說明。

還有一點(diǎn),就是預(yù)登陸的url:

http://login.sina.com.cn/sso/...

這里su的值是自己用戶名經(jīng)過base64編碼的值。但可能你們會(huì)問我是如何知道的呢,待會(huì)兒我會(huì)講到。經(jīng)過實(shí)測(cè),如果我們這里不給su傳參數(shù),其實(shí)也是可以的。為了最真實(shí)的模擬用戶登錄,我們最好還是帶上它的值。

請(qǐng)看圖一的第一條js請(qǐng)求http://i.sso.sina.com.cn/js/ssologin.js,同學(xué)們可以點(diǎn)進(jìn)去看,這個(gè)就是前面提到的加密用戶名和密碼等一系列的加密文件了,如果有同學(xué)非要問我是怎么找到這個(gè)加密文件的,我也只有說:反復(fù)抓包,從在瀏覽器輸入weibo.com過后就找js文件請(qǐng)求路徑,然后再用代碼格式化工具打開,挨著一個(gè)一個(gè)看,在代碼中搜關(guān)鍵字,比如這里我們可以搜"nonce"、“servertime”等,就能找到加密文件了。

打開加密文件我們可以看到加密用戶名的代碼,在加密js文件中搜索"username",可以看到有一行代碼為:

username = sinaSSOEncoder.base64.encode(urlencode(username))

現(xiàn)在我們可以直接查找encode方法(代碼太多就不貼上來了),即可查找到對(duì)應(yīng)方法了,為了驗(yàn)證我們的猜想,我們可以在webstorm中copy這個(gè)encode函數(shù)帶上自己的用戶名運(yùn)行,返回的結(jié)果就是su的值,這個(gè)值在之后進(jìn)行post提交的時(shí)候也會(huì)用到。如果對(duì)加密有一定經(jīng)驗(yàn)的同學(xué)可能一眼就會(huì)看出這個(gè)是base64編碼,python中有個(gè)base64模塊可以干這個(gè)事情。我們?cè)倩氐綀D一,http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)這個(gè)地址就是進(jìn)行post提交數(shù)據(jù)的地址,下面是我自己提交的數(shù)據(jù):

這里我們需要自己構(gòu)造su(加密后的用戶名),sp(加密后的密碼),servertime,nonce,rsakv等數(shù)據(jù),其它數(shù)據(jù)都不用變。有同學(xué)問我為哈其它數(shù)據(jù)不用變?你自己可以多登陸幾次,看變化的值,那么那些值就是需要構(gòu)造的值,其它值就直接拿過來用就行了。這里的su,servertime,nonce,rsakv都已經(jīng)拿到了,所以當(dāng)前需要的就只是sp的值了。我們還是按照原來的方法在js文件中查找“sp”,可以找到requests.sp=password這段代碼,所以我們就只需要看password怎么構(gòu)造的了。通過查找可以看到關(guān)鍵加密代碼:

password = RSAKey.encrypt([me.servertime,me.nonce].join("t") +"n"+ password)

這一段代碼便是加密密碼的代碼,有經(jīng)驗(yàn)的同學(xué)一看就知道是用的RSA加密,python中也有相應(yīng)的rsa加密庫可用。但是我們假設(shè)大家都沒看出來或者不知道python中有rsa這個(gè)第三方庫。這時(shí)候就要給大家介紹一些我的經(jīng)驗(yàn)了,我現(xiàn)在已經(jīng)知道的有三種模擬登陸方案:

a)最簡(jiǎn)單暴力,效率也是最高的,直接把js源碼轉(zhuǎn)化為相應(yīng)的python代碼,模擬加密流程進(jìn)行加密

b)使用selenium+phantomjs/firefox的方案直接模擬人的操作填寫表單提交數(shù)據(jù)進(jìn)行模擬登陸,這種方式最為簡(jiǎn)單,效率稍微低一些。如果有同學(xué)對(duì)這種簡(jiǎn)單暴力的方式感興趣,可以到我的github上查看一下源碼

c)比較折中的方案,通過pyv8/pyexecjs等渲染js代碼進(jìn)行執(zhí)行,本文主要就是講的這種方式。第一種方式如果是遇到微博調(diào)整了登陸加密算法,就必須改加密代碼,第二種方式和第三種方式不存在這個(gè)問題。

由于我用的是Python3,并不支持PyV8,所以我選了和它類似的PyexecJS,這個(gè)也可以直接執(zhí)行js代碼。我也不是很熟悉Javascript代碼,所以我直接定義了一個(gè)函數(shù)處理加密密碼,并沒對(duì)其加密源代碼修改太多:

function    get_pass(mypass,nonce,servertime,rsakey){

        varRSAKey = newsinaSSOEncoder.RSAKey();

        RSAKey.setPublic(rsakey,"10001");

        password= RSAKey.encrypt([servertime,nonce].join("	") +"
"+ mypass)

        return    password

}

這個(gè)函數(shù)中的東西其實(shí)就是copy的加密文件的加密過程代碼。為了試驗(yàn),我直接使用之前自己登陸抓到的nonce、servertime、rsakey等數(shù)據(jù),在webstorm中調(diào)用這個(gè)函數(shù),但是報(bào)錯(cuò)了,提示"navigator is undefined",webstorm 使用的nodejs的運(yùn)行時(shí)環(huán)境,而navigator為瀏覽器的某個(gè)屬性,所以運(yùn)行會(huì)出問題。于是我就是用phantomjs來作為運(yùn)行時(shí)環(huán)境.考慮到有同學(xué)不知道phantomjs怎么使用,這里我簡(jiǎn)要說一下吧。使用windows的同學(xué)先要去phantomjs官網(wǎng)下載它的可執(zhí)行文件,然后設(shè)置環(huán)境變量。在命令行輸入"phantomjs some.js"即可執(zhí)行some.js文件,其實(shí)就和在命令行執(zhí)行python或者java文件一樣,如果不清楚的可以百度執(zhí)行命令行執(zhí)行python的方法,仿照著來就可以了,再不清楚就問我。使用ubuntu的同學(xué)可以直接用sudo apt-get install phantomjs,就可以安裝使用了。我直接把加密的js文件使用phantomjs運(yùn)行,果然好著呢。原因是因?yàn)閜hantomjs其實(shí)就是一款無ui的瀏覽器,自然支持navigator、window等屬性。而pyexecjs支持使用phantomjs作為運(yùn)行時(shí)環(huán)境,具體用法pyexecjs的git主頁有,我也在代碼中有所體現(xiàn)。

with open("G:/javascript/sinajs.js","r") as f:

        source = f.read()

        phantom = execjs.get("PhantomJS")

        getpass = phantom.compile(source)

        mypass = getpass.call("get_pass",my_pass,nonce,servertime,pubkey)

這段代碼就可以得到加密過后的密碼了。

之后,便可以進(jìn)行post提交,提交地址可以從抓包工具看到:http://login.sina.com.cn/sso/...。

根據(jù)經(jīng)驗(yàn),到這里過程基本就完了。但是微博有點(diǎn)坑啊,這里還需要有一步,就是圖一所示的類似

http://passport.weibo.com/wbs...,

這一步會(huì)將請(qǐng)求重定向,返回當(dāng)前賬號(hào)的登陸信息,如下圖:

那么問題來了,怎么獲取上面的請(qǐng)求地址呢。分析上面地址,有ticket字段,這個(gè)應(yīng)該是讓你登陸的憑據(jù),所以這個(gè)地址應(yīng)該是服務(wù)端返回的,如果不是,起碼ticket是服務(wù)端返回的,于是我們又使用抓包工具查看在請(qǐng)求這段url之前返回的信息,發(fā)現(xiàn)有和上述url吻合的信息:

這段代碼是使用post后回復(fù)的內(nèi)容,所以可以直接從中提取出我們需要的url。然后再使用get方式請(qǐng)求上述的url,它會(huì)經(jīng)歷一次重定向,直接返回登陸信息。這個(gè)時(shí)候,就代表成功登陸了。

PS:授人以魚不如授人以漁,這是我一直秉承的信念??赡苡械睦鲜钟X得我寫得很啰嗦,但其實(shí)很多新手可能都不知道這些細(xì)節(jié),所以我把我在分析新浪微博模擬登陸的過程全寫了出來。另外,除了這種方式,本文提到的另外兩種方式也有實(shí)現(xiàn)。最暴力的方式需要使用rsa這個(gè)第三方庫,具體我在代碼上有詳細(xì)注釋,還有一種是使用selenium+phantomjs這種方式,我也在代碼中關(guān)鍵地方有注釋,如果想看看具體過程,可以點(diǎn)擊這里(我的個(gè)人博客)查看分析過程。

Talk is cheap,show me the code!

最后奉上本文的所有方式的模擬登陸代碼(如果覺得喜歡或者看了對(duì)你有幫助,不妨在github上給個(gè)star,也歡迎fork)

代碼鏈接:smart_login,歡迎fork和star

看了本文還沒看夠?那么推薦你查看超詳細(xì)的Python實(shí)現(xiàn)百度云盤模擬登陸,該文會(huì)從另外一個(gè)角度來談模擬登陸

此外,打一個(gè)廣告,如果對(duì)如何構(gòu)建分布式爬蟲或者大規(guī)模微博數(shù)據(jù)采集感興趣的話,可以專注一下我的開源分布式微博爬蟲項(xiàng)目,目前還在快速迭代,單從功能角度來講,抓取部分基本上快實(shí)現(xiàn)和測(cè)試完了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44363.html

相關(guān)文章

  • 詳細(xì)Python實(shí)現(xiàn)百度云盤模擬登陸(模擬登陸進(jìn)階)

    摘要:方法不僅適用于百度云,別的一些比較難以模擬登陸的網(wǎng)站都可以按照這種方式分析。本文要求讀者具有模擬登陸主要是抓包和閱讀代碼和密碼學(xué)的基本知識(shí)。和模擬登陸微博的分析流程一樣,我們首先要做的是以正常人的流程完整的登錄一遍百度網(wǎng)盤。 這是第二篇從簡(jiǎn)書搬運(yùn)過來的文章(大家別誤會(huì),是我原創(chuàng)的)。因?yàn)榍耙黄恼?,我看反響還挺好的,所以把這篇也搬運(yùn)過來了,其實(shí)目的還是為宣傳自己的分布式微博爬蟲(該項(xiàng)目...

    CarterLi 評(píng)論0 收藏0
  • 知乎最新版模擬登陸詳解,小白能懂

    摘要:模擬登陸知乎這個(gè)知乎的登陸也是坑滿滿,我也給踩了幾個(gè),這個(gè)就直接說坑吧,其他的就不多說了。 以下內(nèi)容僅交流學(xué)習(xí),請(qǐng)勿用于非法用途 如果你現(xiàn)在想模擬登陸知乎,會(huì)發(fā)現(xiàn) fromdata 是一串加密的字符串 showImg(https://segmentfault.com/img/remote/1460000018245629); 看了之后是不是很痛苦?你是不是就想使用 selenium 來...

    buildupchao 評(píng)論0 收藏0
  • 知乎最新版模擬登陸詳解,小白能懂

    摘要:模擬登陸知乎這個(gè)知乎的登陸也是坑滿滿,我也給踩了幾個(gè),這個(gè)就直接說坑吧,其他的就不多說了。 以下內(nèi)容僅交流學(xué)習(xí),請(qǐng)勿用于非法用途 如果你現(xiàn)在想模擬登陸知乎,會(huì)發(fā)現(xiàn) fromdata 是一串加密的字符串 showImg(https://segmentfault.com/img/remote/1460000018245629); 看了之后是不是很痛苦?你是不是就想使用 selenium 來...

    xuxueli 評(píng)論0 收藏0
  • 利用新浪API實(shí)現(xiàn)數(shù)據(jù)抓取微博數(shù)據(jù)爬取微博爬蟲

    摘要:本人長(zhǎng)期出售超大量微博數(shù)據(jù)旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),。如果用戶傳入偽造的,則新浪微博會(huì)返回一個(gè)錯(cuò)誤。 PS:(本人長(zhǎng)期出售超大量微博數(shù)據(jù)、旅游網(wǎng)站評(píng)論數(shù)據(jù),并提供各種指定數(shù)據(jù)爬取服務(wù),Message to [email protected]。由于微博接口更新后限制增大,這個(gè)代碼已經(jīng)不能用來爬數(shù)據(jù)了。如果只是為了收集數(shù)據(jù)可以咨詢我的郵箱,如果是為了學(xué)習(xí)爬蟲,...

    liuyix 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<