1. 程式人生 > >Python3爬蟲實戰——QQ空間自動點贊程式(上)

Python3爬蟲實戰——QQ空間自動點贊程式(上)

(前一段時間剛學了Python,覺得需要拿點東西來練手,於是就決定寫個實用點的東西,也就是這條既能練手又能裝逼的qq空間自動點讚的小爬蟲)

(好多不常聯絡的同學都因為我的秒贊對我表示了他們的感動,搞得我都不敢說我是用程式自動點讚的)

(然而,與其說是練手Python,其實寫這個爬蟲我學到的更多的知識是關於http請求的)

—————————————————————————————————————————————————————————————————

行吧,開車了。

①探索:當我們按下“贊”之後,Qzone的後臺發生了什麼PY交易?

<1>首先,抓包。開啟網頁版的QQ空間(我已經用F12把各種推廣的視窗強行關掉了,以及,兩個號都是我的小號),再開啟抓包工具(這裡我用的抓包工具是Fiddler,百度一下就能找到下載資源了)。先清空Fiddler抓到的包,然後點“贊”,之後“取消贊”。


Fiddler抓到的如下四個資料包


<2>然後,分析包。點選分析目標,選中右邊的Inspector,會得到這個包的解析資料。(如果我們只需要“贊”的功能的話,就只分析第一個資料包就夠了。之後你可以嘗試自己去看“取消贊”的包,其實跟“贊”做的工作是一樣的,只不過post的url不一樣罷了)



在Headers的標籤頁中,我們可以看出,點贊操作用的是POST方法,向“/proxy/domain/w.qzone.qq.com/cgi-bin/likes/internal_dolike_app?g_tk=1589101394”的相對地址POST了這個包,就能實現“贊”的功能

於是,目標很明確,想要實現“贊”,我們就必須模擬這個包,使用python3的http模組中的http.client.HTTPConnection.request()來將這個包傳送給伺服器實現“贊”

。(對應Python2的httplib模組的httplib.HTTPCOnnection.request()函式,其實我到後來才發現有個requests的模組非常好用,大家可以自己百度“python requests”,但下述程式碼還是以python3的http模組來實現)

傳送包的程式碼如下:

from http import client;
from urllib import parse;
httpClient=client.HTTPConnection('h5.qzone.qq.com');
#h5.qzone.qq.com是Host
httpClient.request("POST",url,parse.urlencode(body),headers);
#method是"POST"
#url是上述的"/proxy/domain/w.qzone.qq.com/cgi-bin/likes/internal_dolike_app?g_tk=1589101394",其中g_tk在每次登入空間後都不一樣。
#body和headers是字典型

那麼問題就來了,url和資料包的內容是什麼?怎麼模擬?

②解答:Qzone點贊時,該POST的資料包的內容是什麼?該向誰POST資料包?

<1>該POST的資料包內容之headers

headers={'Host':'h5.qzone.qq.com',
         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0',
         'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
         'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
         'Accept-Encoding':'gzip, deflate',
         'Cookie':'',
         'Connection':'keep-alive',
         'Upgrade-Insecure-Requests':1,
         'Content-Type':'application/x-www-form-urlencoded'
        }
headers['Cookie']='QZ_FE_WEBP_SUPPORT=*; cpu_performance_v8=*; _gdt_close_discover=*; __Q_w_s__QZN_TodoMsgCnt=*; blabla=*; zzpaneluin=*; zzpanelkey=; p_skey=5O9avpyb9nqMw7VP6P9BZ13X8vUUJup50PDFEACDgM8_; pt4_token=*; p_uin=*; pgv_pvi=*; pgv_pvid=*; ptui_loginuin=*; pt2gguin=*; RK=*; ptcz=*; skey*; pgv_si=*; pgv_info=ssid=*; ptisp=*; uin=*; qzone_check=*'
#引數值字元太多,我把cookie中的除了p_skey的引數值都用*代替了。
是的,這些就是headers的內容了,除了Cookie以外,不需要知道其他引數是幹嘛的,因為headers字典中其他的引數對所有使用者實現這個爬蟲都幾乎沒有影響。

所以,Cookie從哪裡找呢?


滑鼠三擊Raw中的Cookie一行,即可選中整行,Ctrl+C複製,貼到程式碼中,去掉字首,兩側加單引號,headers的內容就解決了。

必須使用顏色強調的是:我的這個爬蟲暫沒有實現自動登入Qzone的能力,每次都要靠手動登入,抓包獲取Cookie,修改headers字典的“Cookie”來維持程式正常執行。但由於QQ空間的Cookie只要不斷使用,有效時間將在12個小時以上,所以如果你想讓程式長時間跑,更換Cookie也不會太頻繁。(所以我稱它為簡單的爬蟲)

<2>該POST的資料包內容之body

qqNumber='3236556749';
body={'qzreferrer':'http://user.qzone.qq.com/'+qNumber,
      'opuin':qNumber,
      'unikey':'',
      'curkey':'',
      'from':1,
      'appid':311,
      'typeid':0,
      'active':0,
      'fupdate':1
     }
body['unikey']='http://user.qzone.qq.com/***/mood/54a9a141c35a0b584d460300'
body['curkey']='http://user.qzone.qq.com/***/mood/54a9a141c35a0b584d460300'
#由於點贊物件是常用小號不想洩露,所以我就用***打個馬賽克
params=urllib.urlencode(body)
同樣,我把需要注意的引數單獨拉出來賦值了。包括qqNumber,unikey,和curkey。
qqNumber如其名,就是點贊者的QQ,和Cookie同屬於半固定型別的——在整個程式的執行過程中保持靜態,不會變化。

而unikey和curkey則是會根據說說的不同而動態變化的。原創說說的unikey==curkey成立,而如果是轉發而來的說說則unikey!=curkey為真。curkey的值取決於被轉發者的說說原創時產生的unikey,unikey的值則是轉發者轉發時產生的。

當然,如下圖,指定說說的unikey和curkey可以在在資料包中找到,但是在自動點贊程式中,unikey和curkey顯然不是靜態的!


所以?unikey和curkey在哪裡找呢?這個問題我現在可能很難詳細地講清楚,需要賣個關子,等下一章或者下下章條件湊齊後才能講明白。我只能簡單地說——通過正則表示式過濾含有說說的html頁面來獲得unikey和curkey。

<3>該向誰POST資料包?(url中的可變引數g_tk)

def getGTK(ss):
    hash=5381
    for i in ss:
        hash+=(hash<<5)+ord(i);
    return (hash & 0x7fffffff);
#演算法找自百度搜索"QQ空間 g_tk";
g_tk=getGTK(p_skey);
url="/proxy/domain/w.qzone.qq.com/cgi-bin/likes/internal_dolike_app?g_tk="+str(g_tk);

g_tk的值取決於Cookie中的p_skey的引數值。可以說,它也是半固定的值——整個程式執行過程中g_tk的值不會動態變化。可以使用上述演算法從Cookie中的p_skey計算而來,也可以如下找到:


通常我都是選擇從Cookie中計算出來,避免重啟爬蟲的時候需要改太多引數了。同樣,需要用到正則表示式來將目標p_skey從Cookie中過濾出來,然後計算。

p_skey=re.search('p_skey=([^;^\']*)',cookie).group(1);#正則過濾cookie得到p_skey
g_tk=getGTK(p_skey);
url="/proxy/domain/w.qzone.qq.com/cgi-bin/likes/internal_dolike_app?g_tk="+str(g_tk);

②至此,我們已經具備寫出“點贊類”的主要相關知識

from http import client 
from urllib import parse 
import re
import sys

class httpPOSTer:
    headers=None;
    body=None;
    qNum=None;
    url=None;
    cookie=None;
    url=None;
    
    def getGTK(self,ss):
        hash=5381
        for i in ss:
            hash+=(hash<<5)+ord(i);
        return (hash & 0x7fffffff);
    
    def __init__(self,coo,qqNumber):
        self.cookie=coo;self.qNum=qqNumber;
        p_skey=re.search('p_skey=([^;^\']*)',self.cookie).group(1);
        g_tk=self.getGTK(p_skey);
        self.url="/proxy/domain/w.qzone.qq.com/cgi-bin/likes/internal_dolike_app?g_tk="+str(g_tk);
        self.headers={'Host':'h5.qzone.qq.com',
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0',
            'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
            'Accept-Encoding':'gzip, deflate',
            'Cookie':'',
            'Connection':'keep-alive',
            'Upgrade-Insecure-Requests':1,
            'Content-Type':'application/x-www-form-urlencoded'
        }
        self.headers['Cookie']=coo;
        self.body={'qzreferrer':'http://user.qzone.qq.com/'+qqNumber,
            'opuin':qqNumber,
            'unikey':'',#mark
            'curkey':'',#mark
            'from':1,
            'appid':311,
            'typeid':0,
            'active':0,
            'fupdate':1
        }

    def thumbs_up(self,unikey,curkey):
        self.body['unikey']=unikey;
        self.body['curkey']=curkey;
        print("url="+self.url);
        httpClient=client.HTTPConnection('h5.qzone.qq.com');
        httpClient.request("POST",self.url,parse.urlencode(self.body),self.headers);
        response=httpClient.getresponse();
        print("thumbs_up "+str(response.status)+" "+response.reason);
        httpClient.close();

#main process BEGIN
cookie='(輸入區)';#自己輸入cookie
qqNumber='(輸入區)';#自己輸入qq
qzoneP=httpPOSTer(cookie,qqNumber);#例項化一個點贊類
qzoneP.thumbs_up(unikey,curkey);#使用"thumbs_up()"方法,unikey和curkey的獲得將在下一章或下下章講述
#main process END

(詳細講的話,一章顯然講不完全。我跟同學說,我要寫一篇0基礎看了、都能看懂這個爬蟲程式碼的教程,所以可能有點囉嗦……見諒)

(之後可能還會有一章,或者兩章,講述較多簡單的細節,反正我現在是寫不完了。凌晨四點了,好睏……)

相關推薦

Python3爬蟲實戰——QQ空間自動程式

(前一段時間剛學了Python,覺得需要拿點東西來練手,於是就決定寫個實用點的東西,也就是這條既能練手又能裝逼的qq空間自動點讚的小爬蟲) (好多不常聯絡的同學都因為我的秒贊對我表示了他們的感動,搞得我都不敢說我是用程式自動點讚的) (然而,與其說是練手Python,其實

Python3爬蟲實踐——QQ空間自動程式

    (發完上一篇部落格之後,觀察了一個星期發現閱讀量遲遲突破不了50大關,藍瘦香菇+心疼自己T.T,於是果然又找到了各種拖延的理由,剛才登部落格的時候突然發現有人評論期待我的下篇,立馬精神振奮!開始敲字。) ——————————————————————————————

QQ空間自動

兩種方式實現空間自動點贊,第一種是在瀏覽器登陸後在主頁console中手動輸入,第二種是通過python模擬登陸後實現點贊 JavaScript實現 jQuery(window).scroll(() => { jQuery("a.qz_like_btn_v3[dat

selenium初探:Python+selenium實現QQ空間自動

1、原理簡介 下載好瀏覽器驅動配置好selenium環境後,可使用selenium的webdriver控制瀏覽器,並模擬人類(^_^)對瀏覽器進行操作。 本指令碼只使用到了selenium的一些簡單的切換frame、查詢元素等功能。 這些功能屬於軟體自動化測試領域,更多功能

django2.0+python3.4實戰開發教程-資訊型部落格系統

專案簡介 執行平臺:windows Python版本:3.4 Django版本:2.0 資料庫工具:sqlite 開發工具:Pycharm+sublime-text 寫在開頭:這是我第一次使用Django進行web開發,在此之前並無任何web開發經驗。其中,Django以及htm

細讀百度地圖聚合原始碼

之前在專案中需要用到百度地圖的點聚合,看了百度提供的demo之後,稍微讀了一些原始碼就能達到需求了,所以並未深入解讀原始碼。 最近有空就把百度實現點聚合的原始碼從裡到外仔細研究了一遍受益良多,在此分享一下。 為了方便研究我把百度demo中點聚合相關的類抽出來,新建了個工程,

關於爬蟲時url去重的初步探討

部落格第十五天測試內容:自己寫init_add_request(spider,url:str)方法實現url去重(本次僅測試)工具:Python3.6,Pycharm,scrapy,工程內容:     1. 準備:# spider.pyimport scrapy from s

【Android實戰】沉浸式狀態列實現

傳統的手機狀態列是呈現出黑色條狀的,有的和手機主介面有很明顯的區別。這樣就在一定程度上犧牲了視覺寬度,介面面積變小。 沉浸模式的狀態列和主介面完全融為了一體,在設計上有不同的視覺感受。 我們先上兩張圖,很容易看出區別:        Android在4.4的時候增加了透

ASP.NET MVC 企業級實戰 —— 建立使用者許可權管理示例程式

網上有很多討論ASP.NET MVC,也有討論Jquery外掛的,同時把兩者結合起來做專案開發的卻是比較少。 ASP.NET MVC是比較優秀的後臺框架,而前臺採用JQuery外掛會做出比較漂亮美觀的介面。 講解了如何將兩者結合來開發Web應該系統。 將要建立的使用

Python3簡易介面自動化測試框架設計與實現

目錄 1、開發環境 2、用到的模組 3、框架設計 3.1、流程 3.2、專案結構 5、日誌列印 6、介面請求類封裝

QQ空間自動評論自動 微博自動自動轉發神器帶原始碼超簡單

原理:先找到對應的圖,得到座標點選。或轉發,向下翻頁。自動巡屏。關於怎麼判斷是否已經贊或已經轉發,是通過圖片不一樣,或者把屏從上到下分多個塊實現的。  // QQ空間自動點贊機 小黃人為您點贊。 //12行程式碼實現。原始碼:Rem head FindPic 0,0,10

利用Python+ADB打造一款自動和抽獎機制!這款項目值多少錢?

adb 漢語 pen stat sdcard -i enc 路徑和 備忘錄 為什麽要做這個呢? 鑒於之前已經有同學實現了自動挖掘抖音美女的案例,所以這個想法終於有了一絲付諸實踐的曙光,潘老師和這位同學一樣使用了Python+ADB的方式來實現。 Python

python3 爬蟲實戰:為爬蟲新增 GUI 影象介面

  From:https://blog.csdn.net/Fan_shui/article/details/81611752     一、前言     前面我們寫的爬蟲只能執行在具有python環境的電腦上,若是把原始碼發給別人,很大可

python3 爬蟲實戰:mitmproxy 對接 python 下載抖音小視訊

  From:https://blog.csdn.net/Fan_shui/article/details/81461253     一、前言   前面我們已經用 appium 爬取了微信朋友圈,今天我們學習下 mitmproxy,mi

python3 爬蟲實戰 :用 Appium 抓取手機 app 微信 的 資料

  From:https://blog.csdn.net/Fan_shui/article/details/81413595   本編教程從 appium 的環境配置開始,到抓取手機 app 微信朋友圈結束。 知乎:https://zhuanlan.zhihu.c

批量登入qq空間選推廣連結,增加選量

原始碼請至此處下載:https://github.com/inmyjs/apqq_space 或者直接下載打包好的,https://download.csdn.net/download/kunoy/10652361 ,下載解壓,點選start.exe啟動。 此軟體適合在qq

Python3爬蟲實戰requests模組

上次我通過兩個實戰教學展示瞭如何使用urllib模組(http://blog.csdn.net/mr_blued/article/details/79180017)來構造爬蟲,這次告訴大家一個更好的實現爬蟲的模組,requests模組。使用requests模組進行爬蟲構造時最

Python3爬蟲實戰urllib模組

import urllib.request import os import re import time def url_open(url): # 建立一個 Request物件 req req = urllib.request.Request(url) # 通過 add_head

python3[爬蟲實戰] 爬蟲之requests爬取新浪微博京東客服

爬取的內容為京東客服的微博及評論 思路:主要是通過手機端訪問新浪微博的api介面,然後進行資料的篩選, 這個主要是登陸上去的微博的url連結, 可以看到的介面: 這裡主要爬取的內容為: 說說,說說下面的評論條目 雖然很簡單,但是,不得不說句mmp,爬

python3爬蟲實戰筆記

介紹 python使用版本:python3 (python3網路爬蟲開發實戰筆記) pip換源 pip源: 豆瓣:http://pypi.douban.com/simple/ 清華:https://pypi.tuna.tsinghua.edu