在線工具:微信文章轉(zhuǎn)PDF
抓取程序已開源:wechat_spider
程序原理
準(zhǔn)備工作
1. 安裝Node.js
去Node.js 官網(wǎng)下載對應(yīng)操作系統(tǒng)的安裝包,然后按照默認(rèn)步驟安裝至電腦中。
下載地址:http://nodejs.cn/download/
安裝好之后,打開終端或命令行運行輸入下面代碼,檢查是否安裝成功,如果成功,會輸出當(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é)束上面的運行程序,一般為ctrl + c 。然后在終端運行命令:
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ù)庫,也需要安裝一個程序包來實現(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
本程序為修改和增加AnyProxy 中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ò)傳輸速度 - 其余兩個文件是注釋掉了之前在終端打印的一些提示性的字符,不重要
運行程序部分
anyproxy -i
終端輸入以上命令即可運行。參數(shù)-i 表示開啟HTTPS 。
可操作myRule.js 文件,選擇對應(yīng)的功能。修改文件后,需重啟程序。
運行后,確保電腦和手機(jī)在同一個WiFi 環(huán)境下,然后根據(jù)提示設(shè)置手機(jī)WiFi 的代理,輸入代理網(wǎng)址與端口(運行后終端會提示連接地址)。
之后選擇查看公眾號文章,即可自動抓取數(shù)據(jù)至數(shù)據(jù)庫中。
myRule.js 代碼主要部分
三個主要函數(shù):
getProfile - 對歷史頁的操作,獲取文章其他數(shù)據(jù);插入自動翻頁代碼
getReadAndLikeNum - 獲取文章點贊、閱讀、打賞等數(shù)據(jù)
insertJsForRefresh - 對文章頁的操作,主要是插入自動翻頁代碼
代碼原理
此程序為事件驅(qū)動。即一開始要給定一個觸發(fā)事件,例如打開歷史詳情頁或打開某篇文章。
微信打開歷史詳情頁之后會觸發(fā)事件,運行getProfile 函數(shù),跳至下一個歷史詳情頁后又會觸發(fā)打開歷史詳情頁此事件。
同理,微信打開文章頁會觸發(fā)事件運行insertJsForRefresh 函數(shù),此函數(shù)會向網(wǎng)頁中插入一段腳本自動翻頁,當(dāng)翻頁后,又會觸發(fā)此事件,然后一直運行下去。同時,打開文章頁時,微信會請求另一個鏈接,然后會自動觸發(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個這樣類似的腳本,用于實現(xià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 - 點贊量
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 - 上次抓取時間