動(dòng)態(tài)爬蟲之QQ好友列表

步驟

1、分析qzone請(qǐng)求
2、分析參數(shù)來源
3、仿照數(shù)據(jù)請(qǐng)求

上次寫的一個(gè)qzone登陸寫的不詳細(xì)這次決定寫一個(gè)詳細(xì)分析qzone js 獲取好友列表

分析qzone請(qǐng)求

我們的好友列表要從 qzone 獲取,現(xiàn)在打開 qzone 的鏈接 https://h5.qzone.qq.com/mqzone/index 并且登陸

qzone_login_success.png

你可能會(huì)說你在逗我,這特么哪里來的好友列表
別急,好友列表肯定是有的不然你發(fā)表說說怎么@你的好友呢

說到@好友都明白了吧,我們的好友列表接口就從這里開始攔截接口請(qǐng)求。
先把打開我們發(fā)說說的那個(gè)框框,再把瀏覽器開啟調(diào)試模式,清空網(wǎng)絡(luò)請(qǐng)求攔截列表

qzone_network_requests.png

現(xiàn)在你應(yīng)該在發(fā)說說的那個(gè)界面,點(diǎn)一下說說框下面的 @符號(hào)

qzone_send_message.png

盯住網(wǎng)絡(luò)請(qǐng)求那一塊,找一下那個(gè)像是獲取好友列表的,發(fā)現(xiàn)一共就6個(gè)請(qǐng)求,我一眼就看到了mfriend_list 接口意思很直白啊

qzone_network_requests02.png

好友列表已經(jīng)找到,接下來就是分析參數(shù)了,這個(gè)過程很痛苦

分析參數(shù)來源

首先點(diǎn)我剛剛說到的那一條請(qǐng)求記錄 就是這樣子的 我對(duì)自己的qq號(hào)打了碼畢竟這個(gè)東西獲取到可以直接用cookie登陸的

qzone_friend_list_details.png

這里可能有人會(huì)說,為什么不直接點(diǎn)擊攔截列表上面有個(gè)可以定位js發(fā)出請(qǐng)求的位置,這樣找分析請(qǐng)求參數(shù)不是更簡(jiǎn)單嗎
這邊呢我只能說我之前也找過,但是找不到,因?yàn)辄c(diǎn)擊過去找到的是封裝類的位置

這邊參數(shù)呢不多 六個(gè) 需要分析的就兩個(gè)
qzonetoken c2176b5d6f0deff03d0dd0f59f26e51c2b408aa83419d416c737cc1b21d1e913c861ca780ad34ff4293ca5640b69
g_tk:1760587213
res_uin:***
res_type:normal
format:json
timestamp 時(shí)間戳

我們現(xiàn)在看一下這個(gè) qzonetoken 使用全局搜索找一下看是不是寫在靜態(tài)頁面中的

qzone_search_qzonetoken_result.png

繼續(xù)搜索 window.shine0callback

qzone_search_window.shine0callback_result.png

發(fā)現(xiàn)都是一個(gè)結(jié)果。。。。 后面我試著搜索一下html 里面 發(fā)現(xiàn)竟然真的有

qzone_search_html_result.png

window.shine0callback = 自執(zhí)行函數(shù)
所以呢 qzonetoken 參數(shù)直接用 window.shine0callback 就好了

繼續(xù)全局搜索 g_tk

qzone_search_g_tk_result.png

這邊呢有三個(gè)方法獲取token
1、userHelper.getPskeyToken()
2、userHelper.getToken()
3、user.getToken()

我們先在控制臺(tái)執(zhí)行一下這些方法

qzone_exec_console_out.png

發(fā)現(xiàn) user 能執(zhí)行也和請(qǐng)求的參數(shù)對(duì)上了,不過我還是想找一下 userHelper 這個(gè)東西

先把a(bǔ)jax.js 這個(gè)類給弄到本地來 搜索 userHelper

qzone_search_userHelper_result.png

既然寫在里面的那copy到控制臺(tái)就可以執(zhí)行了
開始我把 userHelper copy進(jìn)去發(fā)現(xiàn)少了一個(gè)getCookie,再把getCookie 也復(fù)制到控制臺(tái)就好了

qzone_exec_console_userHelper.png

這樣子執(zhí)行就能獲取到 token 了

res_uin qq號(hào)碼,我在搜索靜態(tài)html的時(shí)候無意間發(fā)現(xiàn)了可以從 FrontPage 對(duì)象中獲取,當(dāng)然也可以從 user 對(duì)象中獲取
res_type 固定normal
format 固定json
timestamp 時(shí)間戳拿一下系統(tǒng)時(shí)間戳就好

現(xiàn)在參數(shù)都分析完畢,qzone 的接口分析還是蠻簡(jiǎn)單的,不像某寶網(wǎng)站的程序

仿照數(shù)據(jù)請(qǐng)求

請(qǐng)到我上一篇文章拿 qzone登陸 的源碼 傳送到源碼

找到 paresHtml 函數(shù) 在這里先切換到默認(rèn)窗口

def paresHtml(self):
    self.driver.switch_to.default_content()

獲取 qzonetoken 這邊直接執(zhí)行window.shine0callback 就能獲取

qzonetoken = self.driver.execute_script('return window.shine0callback')

獲取 g_tk 上面說到user里面可以直接獲取,那我們就偷個(gè)懶使用 user.getToken()

g_tk = self.driver.execute_script('return user.getToken()')

獲取 res_uin 直接從user 里面 getUin()

res_uin = self.driver.execute_script('return user.getUin()')

獲取時(shí)間戳 由于python 中的time.time()是秒,需要乘個(gè)1000

import time
timestamp = time.time() * 1000

拼接url

list = 'https://mobile.qzone.qq.com/friend/mfriend_list?' \
               'qzonetoken=%s&g_tk=%s&res_uin=%s&res_type=normal&format=json&timestamp=%d' % (
                   qzonetoken, g_tk, res_uin, timestamp)

本身我想偷懶的直接用 self.driver.get() 直接執(zhí)行的 后來想想還是算了,沒有一點(diǎn)技術(shù)含量的東西怎么好意思寫呢
最后決定使用js中的XMLHttpRequest 來模仿請(qǐng)求

    self.driver.execute_script('window.xhr = new XMLHttpRequest;')
    self.driver.execute_script('window.xhr.withCredentials=true;')
    self.driver.execute_script(
        'window.xhr.open(\'GET\',\'%s\',false)' % list)
    self.driver.execute_script('window.xhr.onload = function (e){window.xhrsuccess = window.xhr.responseText}')
    self.driver.execute_script('window.xhr.send()')
    print(self.driver.execute_script('return window.xhrsuccess'))

請(qǐng)求完成后的結(jié)果是這個(gè)樣子的

qzone_xmlHttprequest_result.png

下面是請(qǐng)求返回的結(jié)果

{
    "code":0,
    "subcode":0,
    "message":"",
    "default":0,
    "data":{
        "gpnames":[//分組列表
            {
                "gpid":0,//分組id
                "gpname":"agp"http://分組名稱
            }
        ],
        "list":[//好友列表
            {
              "groupid":0,//分組id
              "isvip":1,//是否是vip 1 是 vip
              "nick":"消費(fèi)主張", //昵稱
              "remark":"消費(fèi)主張",//備注
              "searchField":"12315 消費(fèi)主張 消費(fèi)主張 xiaofeizhuzhang xfzz xiaofeizhuzhang xfzz",//關(guān)鍵字
              "uin":12315,//qq號(hào)碼
              "viplevel":1 //qq等級(jí)
            }
        ],
        "mayknow":{
             "allnum":0,
              "list":null,
              "page":1
        },
        "speciallist":null
     }
}

最后發(fā)一下模仿請(qǐng)求的源碼 結(jié)合我上一篇文章的源碼可以直接執(zhí)行出結(jié)果

import time

def paresHtml(self):
    # 切換到默認(rèn)窗口
    self.driver.switch_to.default_content()
    # 請(qǐng)求狀態(tài)
    shine0callback = self.driver.execute_script('return window.shine0callback')
    # 一定要暫停一下不然 執(zhí)行user的時(shí)候拿不到,因?yàn)閼屑虞d
    time.sleep(1)

    g_tk = self.driver.execute_script('return window.user.getToken()')
    uin = self.driver.execute_script('return window.user.getUin()')
    timestamp = time.time() * 1000

    list = 'https://mobile.qzone.qq.com/friend/mfriend_list?' \
            'qzonetoken=%s&g_tk=%s&res_uin=%s&res_type=normal&format=json&timestamp=%d' % (
                shine0callback, g_tk, uin, timestamp)

    # self.load_cookies()
    # self.driver.get(list)

    self.driver.execute_script('window.xhr = new XMLHttpRequest;')

    self.driver.execute_script(
            'window.xhr.open(\'GET\',\'%s\',false)' % list)
    self.driver.execute_script('window.xhr.onload = function (e){window.xhrsuccess = window.xhr.responseText}')
    self.driver.execute_script('window.xhr.send()')
    print(self.driver.execute_script('return window.xhrsuccess'))

總結(jié)

1、qzone 里面的接口參數(shù)都差不多,總歸來講都能搜索出來
2、qzone 壓縮了js提高了分析的難度
3、好友列表模擬請(qǐng)求時(shí)記得把cookie帶過去否則t不認(rèn)
4、有時(shí)候登陸會(huì)登不上,拿到的好友列表數(shù)據(jù)是請(qǐng)先登錄,刪掉cookie重試即便就好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,214評(píng)論 3 426
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,781評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,588評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,315評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,699評(píng)論 1 327
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,882評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,441評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,189評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,388評(píng)論 1 372
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,613評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,023評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,310評(píng)論 1 293
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,112評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,334評(píng)論 2 377

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,702評(píng)論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,816評(píng)論 18 139
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,489評(píng)論 0 17
  • 豬兔子小姐閱讀 246評(píng)論 4 2
  • 1、 朋友要結(jié)婚了,結(jié)婚對(duì)象認(rèn)識(shí)只有三個(gè)月,雖然覺得詫異,但還是表示祝福;一天晚上,她找我聊天,本應(yīng)該聊聊她的婚禮...
    艾米小姐閱讀 346評(píng)論 0 0