aardio爬蟲) 實戰篇:採集自己的公衆號粉絲列表

前言

只有自己封裝庫的時候,才知道造輪子有多累。之前使用Python的時候,基本都只需要import,隨便哪個功能都有人寫好輪子用。不過造輪子也有好處,可以瞭解一些比較基礎的知識。

其實aardio也有很多已經造好的輪子可以用,只是因爲只有作者在維護,而且沒有一個活躍的社區,所以很多方面有些缺失,比如爬蟲方面。但是aardio寫一些小工具確實很方便,打包成exe也比較小,所以我來造這個輪子。

文中使用到的aardio庫都可以到github下載:https://github.com/kanadeblisst00/aardio-extlibs

需求說明

之前寫的一個視頻號下載工具爲了給公衆號漲粉,對接了公衆號後臺,需要給後臺發送消息獲取使用碼才能使用。開始使用碼有效期是一天,後面改成了七天。

但有些人還是覺得有點麻煩,想讓我弄成永久。我就怕改成永久後,很多人白嫖完就取關了,那對我也沒什麼好處。所以想用每個人的openid作爲永久使用碼,只要填一次,軟件啓動時會連接我的服務器驗證這個openid對應的用戶有沒有取關。

這樣對於用戶而言就不需要去公衆號後臺發送消息這一步驟,可以省點事。不過這對我而言倒是增加了不少工作量。那首先需要一個獲取公衆號粉絲的openid列表的程序。

功能介紹

雖然微信公衆平臺開放了API,但是很多接口訂閱號都用不了,比如獲取粉絲列表,不過我們可以在後臺看到,那用爬蟲也能實現。下面是大概的界面內容:

界面只會顯示當前頁的內容,如果想看全部的數據,可以到當前文件夾下的公衆號粉絲.csv裏查看。採集的所有數據都會保存到裏面(注意:如果還在採集你就打開的話,採集程序將無法保存到裏面而失敗)

打包後的程序也很小,只有2M多。如果用upx壓縮一下會更小,但是壓縮後更容易報毒,所以我現在基本都不壓縮了。

開源地址

代碼是完全開源的,你可以在github下載。如果需要編譯好的軟件可以公衆號後臺發送獲取粉絲列表

https://github.com/kanadeblisst00/CrawlBizUsers

採集思路

微信公衆平臺後臺的接口都沒有加密,只要抓個包就能請求,

用我封裝好的kirequests庫請求如下:

import kirequests

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0"
}
var session = kirequests.session(headers,,cookies);
var url = "https://mp.weixin.qq.com/cgi-bin/user_tag"
var params = {
	"action": "get_user_list",
	"groupid": -2,
	"limit": 20,
	"offset": 0,
	"token": token,
	"lang": "zh_CN",
	"f": "json",
	"backfoward": 1,
	"ajax": 1,
	"random": "0." + ..string.random(16, "0123456789"),
	"begin_openid": "xxxxxxxxxx",
	"begin_create_time": 11111
}
var resp = session.get(url,params);
var datas = resp.json()

獲取cookies

採集比較麻煩的是cookies的獲取方式。看一些項目獲取cookies的基本都是讓用戶自己填,有的方便一點的會自動獲取瀏覽器的cookies。

如果讓用戶自己填的話會提高使用門檻,如果獲取用戶瀏覽器的cookies又比較麻煩,Python有現成的庫可以做到,aardio還要自己實現,而且獲取用戶cookies這種也比較敏感。

所以我這裏直接開一個瀏覽器,然後訪問微信公衆平臺的登錄頁面,讓用戶掃碼登錄,然後獲取cookies後自動關閉瀏覽器,開始採集。這樣用戶只需要一個掃碼的過程。

開啓瀏覽器

aardio中開啓瀏覽器有非常多種方式,具體可以看範例-》Web界面

這裏我選擇web.view來做,這個比較輕量(因爲用的系統API,類似安卓的Via那種模式),它是基於微軟的WebView2,win10和win11系統基本都自帶了這個東西。後面我要實現的瀏覽器驅動程序(類似Python的drissionpage)也是用的這個來實現。

import web.view;

var webView = web.view(winform); 
var url = "https://mp.weixin.qq.com";
webView.go(url);

如果是已經登錄的請求,url會跳轉到https://mp.weixin.qq.com/cgi-bin/home,所以這裏只需要循環判斷一下鏈接有沒有變成這個

var doJavasciptCode = function(webView, code){
	var jscode = "(function(){"+code+'\n})()';
	var result;
	webView.doScript(jscode, function(r){
		result = r;
	}
	)
	while(!result){
		win.delay(10);
	}
	return result;
}

var getLoctionHref = function(webView){
	return doJavasciptCode(webView, "return document.location.href;");
}
var curUrl = getLoctionHref(webView);
while(!string.find(curUrl, "@https://mp.weixin.qq.com/cgi-bin/home")){
	win.delay(500);
	curUrl = getLoctionHref(webView);
}

然後開始獲取cookies,獲取到的cookies格式是一個數組,數組每個元素都是一個cookie字典,有name、value等字段。直接將它傳給kirequests即可,不需要做什麼處理

var getCookiesArray = function(webView){
	var result = webView.cdp("Network.getCookies");
	var cookies = result.cookies;
	return cookies
}
var cookies = getCookiesArray(webView);
var session = kirequests.session(,,cookies);

然後只需要一直翻頁就能獲取全部的公衆號粉絲列表了

清除cookies

如果採集完數據,想要刪除webview的cookies,可以刪除C:\Users\用戶名\AppData\Local\aardio\webview2\user-data下面的文件夾,這個就是webview默認的緩存目錄

本文由博客一文多發平臺 OpenWrite 發佈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章