在線工具:微信文章轉(zhuǎn)PDF
抓取程序已開源:wechat_spider
程序原理
準(zhǔn)備工作
1. 安裝Node.js
去Node.js 官網(wǎng)下載對應(yīng)操作系統(tǒng)的安裝包,然后按照默認(rèn)步驟安裝至電腦中降淮。
下載地址:http://nodejs.cn/download/
安裝好之后扔役,打開終端或命令行運(yùn)行輸入下面代碼始藕,檢查是否安裝成功啡邑,如果成功,會輸出當(dāng)前Node 版本號呻粹。
node -v
2. 安裝AnyProxy 代理服務(wù)器
命令行或終端輸入以下命令勇哗,表示全局安裝AnyProxy 程序包:
npm install -g anyproxy
如果是Mac 系統(tǒng)昼扛,可能需要在命令前添加sudo
,然后輸入密碼:
sudo npm install -g anyproxy
輸入以上命令后欲诺,電腦會自動從網(wǎng)絡(luò)下載程序包并安裝野揪。
參考網(wǎng)址:https://github.com/alibaba/anyproxy
3. 啟動AnyProxy
終端輸入:
anyproxy
Mac 系統(tǒng)需輸入(以后的命令也是需要輸入sudo
,下面就忽略不寫了):
sudo anyproxy
如出現(xiàn)下面提示瞧栗,則表明安裝成功:
4. 安裝HTTPS 網(wǎng)絡(luò)傳輸所需的證書
電腦安裝
微信采用加密的HTTPS 網(wǎng)絡(luò)傳輸斯稳,所以需要安裝證書。結(jié)束上面的運(yùn)行程序迹恐,一般為ctrl + c
挣惰。然后在終端運(yùn)行命令:
anyproxy --root
此時會在文件夾生成rootCA.crt
證書與對應(yīng)的密鑰rootCA.key
,根據(jù)提示打開對應(yīng)文件夾殴边,雙擊安裝rootCA.crt
證書憎茂。
手機(jī)安裝
電腦命令行或終端輸入anyproxy
命令啟動代理程序,然后瀏覽器中輸入網(wǎng)址http://localhost:8002/qr_root
锤岸,則會出現(xiàn)證書二維碼竖幔,然后手機(jī)掃描此證書二維碼,下載按照提示完成安裝即可是偷。
參考網(wǎng)址1:https://github.com/alibaba/anyproxy/wiki/HTTPS%E7%9B%B8%E5%85%B3%E6%95%99%E7%A8%8B
參考網(wǎng)址2:http://anyproxy.io/cn.html#配置幫助
安裝mysql 模塊部分
默認(rèn)你的電腦上已經(jīng)安裝了mysql 數(shù)據(jù)庫拳氢,現(xiàn)在node 連接mysql 數(shù)據(jù)庫募逞,也需要安裝一個程序包來實(shí)現(xiàn):
npm install -g mysql
程序部分
程序地址
windows 程序AnyProxy 默認(rèn)的安裝目錄在:C:\Users\你的用戶名\AppData\Roaming\npm\node_modules\anyproxy
Mac 安裝目錄為:/usr/local/lib/node_modules/anyproxy
本程序?yàn)樾薷暮驮黾覣nyProxy 中lib
文件中對應(yīng)的代碼部分。
我的代碼部分
我會發(fā)送給你下面5個文件馋评,你只需覆蓋掉lib
目錄中對應(yīng)的文件即可放接。(建議先備份)
./anyproxy
./lib
myRule.js
rule_default.js
1.png
requestHandler.js
httpsServerMgr.js
- 其中邏輯部分主要寫在
myRule.js
文件中,此文件已做了詳細(xì)的注釋 -
rule_default.js
是判斷各種網(wǎng)絡(luò)請求數(shù)據(jù)然后調(diào)用對應(yīng)的方法 -
1.png
為很小的一個圖片留特,替換手機(jī)所有圖片請求纠脾,加快網(wǎng)絡(luò)傳輸速度 - 其余兩個文件是注釋掉了之前在終端打印的一些提示性的字符,不重要
運(yùn)行程序部分
anyproxy -i
終端輸入以上命令即可運(yùn)行蜕青。參數(shù)-i
表示開啟HTTPS
苟蹈。
可操作myRule.js
文件,選擇對應(yīng)的功能右核。修改文件后慧脱,需重啟程序。
運(yùn)行后蒙兰,確保電腦和手機(jī)在同一個WiFi 環(huán)境下磷瘤,然后根據(jù)提示設(shè)置手機(jī)WiFi 的代理芒篷,輸入代理網(wǎng)址與端口(運(yùn)行后終端會提示連接地址)搜变。
之后選擇查看公眾號文章,即可自動抓取數(shù)據(jù)至數(shù)據(jù)庫中针炉。
myRule.js 代碼主要部分
三個主要函數(shù):
getProfile - 對歷史頁的操作挠他,獲取文章其他數(shù)據(jù);插入自動翻頁代碼
getReadAndLikeNum - 獲取文章點(diǎn)贊篡帕、閱讀殖侵、打賞等數(shù)據(jù)
insertJsForRefresh - 對文章頁的操作,主要是插入自動翻頁代碼
代碼原理
此程序?yàn)槭录?qū)動镰烧。即一開始要給定一個觸發(fā)事件拢军,例如打開歷史詳情頁或打開某篇文章。
微信打開歷史詳情頁之后會觸發(fā)事件怔鳖,運(yùn)行getProfile
函數(shù)茉唉,跳至下一個歷史詳情頁后又會觸發(fā)打開歷史詳情頁此事件。
同理结执,微信打開文章頁會觸發(fā)事件運(yùn)行insertJsForRefresh
函數(shù)度陆,此函數(shù)會向網(wǎng)頁中插入一段腳本自動翻頁,當(dāng)翻頁后献幔,又會觸發(fā)此事件懂傀,然后一直運(yùn)行下去。同時蜡感,打開文章頁時蹬蚁,微信會請求另一個鏈接恃泪,然后會自動觸發(fā)getReadAndLikeNum
函數(shù)。
歷史詳情頁有4種插入js
代碼的方式缚忧,已在代碼中注釋悟泵。
Js 注入詳解
文章頁自動翻頁原理為在網(wǎng)頁head
部分插入類似以下形式代碼,表示隔5s 跳轉(zhuǎn)至下一個文章頁
<meta http-equiv="refresh" content="5;url=https://..." />
歷史詳情頁注入Js 腳本示例闪水,將以下腳本插入至返回給微信客戶端的數(shù)據(jù)中糕非,可以使網(wǎng)頁自動下拉至最低端,到最早一篇文章之后再跳轉(zhuǎn)至下一個歷史消息詳情頁:
<script type="text/javascript">
var end = document.createElement("p");
document.body.appendChild(end);
(function scrollDown(){
// 下拉至頁面最低端后球榆,微信會自動向服務(wù)器請求數(shù)據(jù)
end.scrollIntoView();
var loadMore = document.getElementsByClassName("loadmore with_line")[0];
// 判斷是否到達(dá)最早一篇文章
if (!loadMore.style.display) {
document.body.scrollIntoView();
// 插入meta朽肥,使10秒后自動翻頁
var meta = document.createElement("meta");
meta.httpEquiv = "refresh";meta.content = "10;url=' + nextProLink + '";
document.head.appendChild(meta);
} else {
// 每個隨機(jī)時間段下拉網(wǎng)頁
setTimeout(scrollDown,Math.floor(Math.random()*2000+1000));
}
})();
</script>
我在代碼部分寫了4個這樣類似的腳本,用于實(shí)現(xiàn)不同情況下特定的功能持钉。你可在運(yùn)行時作出選擇衡招。
數(shù)據(jù)庫部分
myRule.js
文件開頭會有數(shù)據(jù)庫連接,對應(yīng)修改成自己的數(shù)據(jù)庫配置每强。
// 創(chuàng)建數(shù)據(jù)庫連接始腾,需根據(jù)自己數(shù)據(jù)庫賬號密碼修改
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '0000',
database: 'phone_weixin'
});
數(shù)據(jù)庫中有4張表,分別對應(yīng)文章信息空执,歷史消息抓取記錄和公眾號信息浪箭。
msg
history
mpaccout
content
表的結(jié)構(gòu)也在發(fā)你的文件中。在mysql 數(shù)據(jù)庫中新建好即可辨绊。
數(shù)據(jù)庫字段解釋
msg.sql
id - 文章id奶栖,自動遞增
msg_title - 文章標(biāo)題
msg_link - 文章永久鏈接
publish_time - 文章發(fā)布時間,13位時間戳形式
modi_time - 數(shù)據(jù)抓取時間门坷,13位時間戳形式
read_num - 閱讀量
like_num - 點(diǎn)贊量
reward_total_count - 安卓手機(jī)贊賞量
msg_idx - 文章發(fā)布位置宣鄙,首條、二條等等
msg_biz - 公眾號唯一標(biāo)識默蚌,重要
msg_source_url - 文章閱讀原文鏈接冻晤,若無則空
msg_cover - 文章封面圖片鏈接
msg_digest - 文章摘要
is_fail - 文章是否刪除,如果刪除改為1绸吸,下次就不在抓取
copyright_stat - 文章是否原創(chuàng)標(biāo)識 11為原創(chuàng) 100為無原創(chuàng) 101為轉(zhuǎn)發(fā)
author - 文章作者
mpaccount.sql
id - 公眾號id鼻弧,自動遞增
biz - 公眾號唯一標(biāo)識
nickname - 公眾號名稱
metavalue - 公眾號id
history.sql
id - 公眾號id,自動遞增
biz - 公眾號唯一標(biāo)識
url - 上次抓取的鏈接
moditime - 上次抓取時間