摘要:在這里真心感謝一直在支持我的那幾個(gè)粉絲,謝謝你們的持續(xù)關(guān)注點(diǎn)贊。果然,第三個(gè)包也是按的步差來的,而為零不變,也不變。函數(shù)里面的話就是個(gè)循環(huán)咯,當(dāng)條件不滿足時(shí)就一直加,知道條件滿足為止。我每天都會(huì)抽時(shí)間給我的粉絲解答,給與一些學(xué)習(xí)資源。
目錄
? ? ? ? 本人所有文章內(nèi)容、源碼,除官方企業(yè)外,禁止個(gè)人轉(zhuǎn)載,謝謝配合。
? ? ? ? ....太多培訓(xùn)機(jī)構(gòu)拿我的文章源碼去講公開課了,還有很多培訓(xùn)機(jī)構(gòu)的招生員拿我源碼自己編個(gè)小故事直接就是一篇文章(但凡這種都是一大堆廢話+源碼,毫無分析邏輯)。
????????大家好,我叫善念。有大概一周沒有來更新博文了,一個(gè)原因是反響并不理想,第二個(gè)原因則是每篇文章都是現(xiàn)寫的,花費(fèi)的時(shí)間并不少。
? ? ? ? 其實(shí)我并不是非常想更新這篇文章,這樣子會(huì)造成很多人利用我的辦法,給大家?guī)硪恍┥钌系男±_,可是很多人又很想學(xué),我只想說:技術(shù)無罪。
????????在這里真心感謝一直在支持我的那幾個(gè)粉絲,謝謝你們的持續(xù)關(guān)注點(diǎn)贊。
使用到的模塊
from selenium import webdriverimport jsonimport requestsimport execjsimport jsonpath
模塊的安裝
主要利用到這五個(gè)模塊,其中json為內(nèi)置模塊,其它均為第三方模塊。安裝方式如下所示:
pip install seleniumpip install requestspip install PyExecjspip install jsonpath
插件的安裝
關(guān)于selenium這個(gè)模塊,咱們來重點(diǎn)介紹一下:
????????Selenium是一個(gè)用于Web應(yīng)用程序測(cè)試的工具。Selenium測(cè)試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣。
? ? ? ? 如果不能夠理解我就講點(diǎn)白話,如果你是web開發(fā)人員,開發(fā)好了幾百個(gè)網(wǎng)站,那么如果你認(rèn)為的去一個(gè)個(gè)的測(cè)試BUG,是不是很浪費(fèi)時(shí)間?而selenium這個(gè)框架就是用來模擬人去自動(dòng)化操控瀏覽器的,那么是不是就節(jié)約了很多時(shí)間呢。
既然selenium能夠操控瀏覽器,那么它們之間必須要有一個(gè)橋梁,總不能無中生有吧?
????????那么操控的瀏覽器款式不一樣,中間的橋梁也是不一樣的。比如我更喜歡用chrome瀏覽器,那么咱們需要下載一個(gè)selenium與Chrome的橋梁——Chromedriver插件
下載與你當(dāng)前谷歌瀏覽器版本最相近的Chromedriver
那么像我的話,下載?即可。
Windows系統(tǒng)需下載32位,其它的自己看著辦。點(diǎn)進(jìn)去下載win32即可。
那么如何讓Python與selenium連接起來呢,這里咱們需要配置一個(gè)環(huán)境變量,就是把Python與selenium處于同一個(gè)目錄:
到此為止,咱們的環(huán)境就搭建好了。
?
進(jìn)入咱們的目標(biāo)網(wǎng)站:目標(biāo)網(wǎng)站
?
點(diǎn)擊登錄后點(diǎn)擊群管理:
再點(diǎn)擊成員管理,進(jìn)入咱們的數(shù)據(jù)頁面:?
在這個(gè)頁面可以看到有很多的群,我們隨便點(diǎn)擊一個(gè)就可以看到當(dāng)群的成員數(shù)據(jù):?
可以看到咱們的群的號(hào)碼其實(shí)就在當(dāng)前網(wǎng)頁的url中....不難想到它的url就是隨咱們的群的號(hào)碼變化的。
以此群為例,咱們看下網(wǎng)頁源代碼中是否包含咱們的數(shù)據(jù),直接搜一下自己的號(hào)碼即可,因?yàn)槲易约菏强隙ㄔ谌寒?dāng)中的嘛:
?
?emmm什么都沒有,再去網(wǎng)頁元素中看一下吧:
網(wǎng)頁元素中是有的,一個(gè)tr標(biāo)簽保存了一個(gè)成員信息。不過我群里九百多個(gè)人,為什么右邊的進(jìn)度條這么粗....?
說明什么?異步加載咯,經(jīng)常說到得瀑布流,當(dāng)我們拉動(dòng)下滑條的時(shí)候才會(huì)刷新出更多得成員數(shù)據(jù)
?
明顯看得到吧,當(dāng)我們拉動(dòng)下滑條后,元素中的元素變多了,那個(gè)進(jìn)度條變短了。
????????那么就可以總結(jié)出來思路了,就是當(dāng)我們用selenium模擬人打開一個(gè)瀏覽器,然后我們登錄、點(diǎn)開群管理、找到需要采集的群點(diǎn)擊(或者直接進(jìn)入到當(dāng)前群的url也是可行的)、最后就是拉動(dòng)下滑條然后用selenium從網(wǎng)頁元素上爬取數(shù)據(jù)咯。
? ? ? ? 應(yīng)該不難理解吧,這其實(shí)就是我們剛才人為做的一個(gè)事情。我只是用selenium代替我們?nèi)巳ツM這個(gè)事情再做一遍。
? ? ? ? 而我反復(fù)強(qiáng)調(diào)過:selenium的速度太慢太慢,盡量不要去使用它!
? ? ? ? 那么怎么辦?抓包唄,網(wǎng)頁源代碼中沒有數(shù)據(jù),而下拉滑動(dòng)條后網(wǎng)頁元素中出現(xiàn)了該數(shù)據(jù),不就是說明當(dāng)我們拉動(dòng)下滑條就執(zhí)行了一些JavaScript腳本或者一些接口從而產(chǎn)生了數(shù)據(jù)?
? ? ? ? 數(shù)據(jù)也是不可能無中生有的,總有個(gè)來源,咱們監(jiān)聽下服務(wù)器與客服端的一個(gè)交流過程:
?
刷新當(dāng)前網(wǎng)頁抓包后,可以看到咱們抓的包當(dāng)中生成了0-20就是21條數(shù)據(jù),然后再看看這個(gè)包需要的參數(shù):
是一個(gè)post請(qǐng)求,然后參數(shù)的話...gc貌似就是群的號(hào)碼,然后st為0、end為20啥的估計(jì)就是說0-20總共21條數(shù)據(jù)吧,bkn......大頭菜,明顯不是一個(gè)時(shí)間戳,按道理是JavaScript加密。
我們?cè)倮瓌?dòng)點(diǎn)滑動(dòng)條往下面拉,再抓一個(gè)包看看有沒有什么參數(shù)發(fā)生變化:
?
果然0-20就是代表一個(gè)數(shù)據(jù)的排序,比如我第一個(gè)包是0-20是前面的21條數(shù)據(jù),那么第二個(gè)包當(dāng)然就是21-41了。
果然,第三個(gè)包也是按21的步差來的,而sort為零不變,bkn也不變。
走吧,開始去分析咱們的bkn是如何生成的:
上次有人問我,這個(gè)玩意該怎么搜...我這里告訴你們了,先點(diǎn)一下那三個(gè)點(diǎn),然后點(diǎn)擊search:
?
可以看到就一個(gè)JS文件中包含bkn,簡(jiǎn)直完美了,事情變得越來越簡(jiǎn)單。
?
請(qǐng)不要遇到JavaScript加密就鬧心,靜下心來好好看看
o.data.bkn
?o字典里面的data里面的bkn就是個(gè)嵌套而已,也就是說明bkn屬于o字典里面的一個(gè)鍵,然后它居然賦值給了一個(gè)函數(shù)function,注意看結(jié)尾用了一個(gè)()啥意思?
把把函數(shù)賦值給一個(gè)變量bkn,然后調(diào)用該函數(shù)。說明什么?bkn就為函數(shù)中return的值呀......是不是很簡(jiǎn)單?看不懂多看幾遍。
函數(shù)里面的話就是個(gè)循環(huán)咯,當(dāng)條件不滿足時(shí)就一直加,知道條件滿足為止??床欢梢匀W(xué)學(xué)基本的JavaScript語法,不學(xué)也問題不大,咱們直接摳JavaScript代碼也行。
for (var e = $.cookie("skey"), t = 5381, n = 0, o = e.length; n < o; ++n) t += (t << 5) + e.charAt(n).charCodeAt(); return 2147483647 & t
e為cookie中"skey"鍵所對(duì)應(yīng)的值,o為e這個(gè)字符串的長度,n起始值為0.....居然都是已知數(shù)據(jù),壓根沒有變量,那么咱們看看skey對(duì)應(yīng)的值是啥:
好像問題是已經(jīng)解決了吧,那么咱們來測(cè)試一下:
?看下與咱們的post參數(shù)是否相同:
emmmmm,大功告成拉!
總結(jié)下思路:
1.利用selenium打開瀏覽器然后登錄
2.獲取cookies保存(后期用來解密bkn的)
3.解密JavaScript
4.發(fā)送post請(qǐng)求想要采集的群號(hào)
JS代碼:
function GetBkn(e) {for (t = 5381, n = 0, o = e.length; n < o; ++n) t += (t << 5) + e.charAt(n).charCodeAt();return 2147483647 & t}
Python代碼:
#!/usr/bin/python3# -*- coding: utf-8 -*-# @Time : 2019/6/02 21:44# @Author : 善念# @File : demo12.py# @Software: PyCharmfrom selenium import webdriver# from time import sleepimport jsonimport requestsimport execjsimport jsonpath# import sysdef get_cookies(): driver = webdriver.Chrome() driver.get("https://qun.qq.com/manage.html#click") driver.find_element_by_xpath("http://*[@id="headerInfo"]/p[1]/a").click() # sleep(5) input("登陸后請(qǐng)按Enter") cookie_list = driver.get_cookies() cookie = {} for i in cookie_list: cookie[i["name"]] = i["value"] with open("cookies.txt", "w") as f: f.write(json.dumps(cookie)) f = open("cookies.txt") # 字符串轉(zhuǎn)字典 cookies = json.loads(f.read()) f.close() driver.close() return cookiesdef get_bkn(cookies): e = cookies["skey"] with open("gtk.js", encoding="utf-8") as f: jsData = f.read() js_text = execjs.compile(jsData) bkn = js_text.call("GetBkn", e) return bkndef get_data(bkn, cookies): headers = { "origin": "https://qun.qq.com", "referer": "https://qun.qq.com/member.html", "sec-fetch-mode": "cors", "sec-fetch-site": "same-origin", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.29 Safari/537.36", "x-requested-with": "XMLHttpRequest", } qq_group = input("請(qǐng)輸入你要查詢的QQ群號(hào)碼:") offset = 21 max_num = [] for index, i in enumerate(range(0, 5000, offset)): data = { "gc": qq_group, "st": i, "end": 20 + offset*index, "sort": "0", "bkn": bkn, } req = requests.post("https://qun.qq.com/cgi-bin/qun_mgr/search_group_members", headers=headers, data=data, cookies=cookies).json() qq_numbers = jsonpath.jsonpath(req, "$..uin",) qq_names = jsonpath.jsonpath(req, "$..nick",) try: max_num.append(len(qq_numbers)) for QQ_number, QQ_name in zip(qq_numbers, qq_names): with open(qq_group+".txt", "a", encoding="utf-8")as f: f.write(str(QQ_number)+"@qq.com"+"/n") print("共獲得成員數(shù):%d" % sum(max_num)) except TypeError: exit()def go(): cookies = get_cookies() bkn = get_bkn(cookies) get_data(bkn, cookies)if __name__ == "__main__": go()
當(dāng)你毫無保留的信任一個(gè)人,最終只會(huì)有兩個(gè)結(jié)果,不是生命中的那個(gè)人,就是生命中的一堂課。
但凡文章內(nèi)容中有不懂之處,歡迎及時(shí)私信于我。我每天都會(huì)抽時(shí)間給我的粉絲解答,給與一些學(xué)習(xí)資源。
原創(chuàng)不易,再次謝謝大家~
?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/119686.html
摘要:這些特性不僅帶來了大的性能提升,還減少多線程程序設(shè)計(jì)的復(fù)雜性,進(jìn)而提高了開發(fā)效率。由公司建立的云計(jì)算平臺(tái)率先支持了。 前言 本文章主要寫給那些想了解node語言的開發(fā),我的目標(biāo)希望大家通過閱讀本篇文章能夠簡(jiǎn)單使用node進(jìn)行開發(fā),以及了解一些事件驅(qū)動(dòng)的異步編程風(fēng)格,主要分node的背景,安裝配置,模塊創(chuàng)建引用等幾個(gè)方面描述 建議大家在閱讀本篇文章途中 可以親自嘗試一下我所帶來的小例子,...
摘要:讓你收獲滿滿碼個(gè)蛋從年月日推送第篇文章一年過去了已累積推文近篇文章,本文為年度精選,共計(jì)篇,按照類別整理便于讀者主題閱讀。本篇文章是今年的最后一篇技術(shù)文章,為了讓大家在家也能好好學(xué)習(xí),特此花了幾個(gè)小時(shí)整理了這些文章。 showImg(https://segmentfault.com/img/remote/1460000013241596); 讓你收獲滿滿! 碼個(gè)蛋從2017年02月20...
摘要:日志服務(wù)提供就是為解決以上輕量級(jí)埋點(diǎn)采集場(chǎng)景而生,我們可以在分鐘時(shí)間內(nèi)完成埋點(diǎn)和數(shù)據(jù)上報(bào)工作。服務(wù)功能包括實(shí)時(shí)采集與消費(fèi)。 摘要: 當(dāng)我們有一個(gè)新內(nèi)容時(shí)(例如新功能、新活動(dòng)、新游戲、新文章),作為運(yùn)營人員總是迫不及待地希望能盡快傳達(dá)到用戶,因?yàn)檫@是獲取用戶的第一步、也是最重要的一步。 點(diǎn)此查看原文:http://click.aliyun.com/m/40929/ 我們發(fā)送重要郵件時(shí)為...
摘要:日志服務(wù)提供就是為解決以上輕量級(jí)埋點(diǎn)采集場(chǎng)景而生,我們可以在分鐘時(shí)間內(nèi)完成埋點(diǎn)和數(shù)據(jù)上報(bào)工作。服務(wù)功能包括實(shí)時(shí)采集與消費(fèi)。 摘要: 當(dāng)我們有一個(gè)新內(nèi)容時(shí)(例如新功能、新活動(dòng)、新游戲、新文章),作為運(yùn)營人員總是迫不及待地希望能盡快傳達(dá)到用戶,因?yàn)檫@是獲取用戶的第一步、也是最重要的一步。 點(diǎn)此查看原文:http://click.aliyun.com/m/40929/ 我們發(fā)送重要郵件時(shí)為...
摘要:學(xué)習(xí)筆記七數(shù)學(xué)形態(tài)學(xué)關(guān)注的是圖像中的形狀,它提供了一些方法用于檢測(cè)形狀和改變形狀。學(xué)習(xí)筆記十一尺度不變特征變換,簡(jiǎn)稱是圖像局部特征提取的現(xiàn)代方法基于區(qū)域圖像塊的分析。本文的目的是簡(jiǎn)明扼要地說明的編碼機(jī)制,并給出一些建議。 showImg(https://segmentfault.com/img/bVRJbz?w=900&h=385); 前言 開始之前,我們先來看這樣一個(gè)提問: pyth...
閱讀 925·2021-10-18 13:32
閱讀 3527·2021-09-30 09:47
閱讀 2168·2021-09-23 11:21
閱讀 1893·2021-09-09 09:34
閱讀 3493·2019-08-30 15:43
閱讀 1533·2019-08-30 11:07
閱讀 1072·2019-08-29 16:14
閱讀 737·2019-08-29 11:06