利用搜狗抓取微信公眾號文章
微信一直是一個自己玩的小圈子,前段時間搜狗推出的微信搜尋帶來了一絲曙光。搜狗搜尋推出了內容搜尋和公眾號搜尋兩種,利用後者可以抓取微信公眾號的最新內容,看了下還是比較及時的。
每個公眾號都有一個openid,最早可以直接利用http://weixin.sogou.com/gzh?openid=***
來獲取頁面,但改版後對openid進行了加密操作,使用原來的方法返回的資料為空。
利用httpFox追蹤一下訪問的行為,如下圖:
可以看到從按下回車到頁面返回還是做了不少工作的。
倒著看吧,倒數第二行,很多*的,如果用瀏覽器訪問這個地址,返回的就是要顯示的資料。如下所示:
sogou.weixin.gzhcb({"page":1,"items":["<?xml version=\"1.0\" encoding=\"gbk\"?> <DOCUMENT><docid><\/docid><item> <key><![CDATA[http://mp.weixin.qq.com/]]><\/key><tplid><![CDATA[555]]><\/tplid><classid>11002601<\/classid> <display> <docid>ab735a258a90e8e1-6bee54fcbd896b2a-6deb4d71ff08347f1929b25ff173e5de<\ /docid> <tplid>550<\/tplid><title><![CDATA[【突發】一艘載有400餘人的客輪在長江沉沒 搜救正在進行]]><\/title><url><![CDATA[http://mp.weixin.qq.com/s?__biz=MjM5MjAxNDM4MA==&mid=216655341&idx=1&sn=fd0396cb30456a310475ff351e9fa975&3rd=MzA3MDU4NTYzMw==&scene=6#rd]]><\/url> <title1><![CDATA[【突發】一艘載有400餘人的客輪在長江沉沒 搜救正在進行]]><\/title1><imglink>……
稍微看下吧,返回的是一個函式,引數是json格式,裡邊的“items”項包含了我們需要的資料,資料是用xml封裝的。
我們的目標就是拿到這個地址,看一下地址格式吧:
http://weixin.sogou.com/gzhjs?cb=sogou.weixin.gzhcb&openid=oIWsFt8_jYUmdw1PQgNVhH9vOEvI&eqs=u2sOoEZgaZS%2FoFkRolp3ouB8PR5ws8VLuA6UkIOcm%2FsE6V1su3gtWzdYQvnCCEr9%2FDBil&ekv=4&page=1&t=1433207090966
裡邊有幾個引數:
- cb:固定為“sogou.weixin.gzhcb”
- openid:根據公眾號來填
- eqs:這個比較麻煩,下面再說
- ekv:貌似填4就可以了
- page:頁碼,預設每頁顯示10條,需要檢視更多的時候用它來翻頁
- t:時間引數,貌似並沒有什麼O用
首先看看上邊這些引數預設的情況下會發生什麼,t缺省了沒什麼影響,page預設預設返回第一頁,ekv或eqs預設的話返回的結果裡沒有資料,也就是items裡的資料是“[]”
所以現在的關鍵就在“eqs”上了。
利用chrome的開發者工具看看吧
有兩個js
下面這個就是我們需要的返回資料
看看上邊那個,主要的是前面兩句:
<script>
SogouEncrypt.setKv("8d44ae022be","4");
window.aes=SogouEncrypt.encryptquery("oIWsFt_a1YRtD7vlIAkWmeqAWcBU","sogou");
</script>
字面上來看,是對openid進行了加密操作,有一個辦法,就是模擬引數,然後呼叫這些js,需要繼續看看js程式碼,有點頭大。
另闢蹊徑吧,發現加密操作中的引數都是固定的,不像新浪微博的加密操作,去看看加密後的結果吧,果然也都是固定的,以“人民日報”為例,openid=“oIWsFt_a1YRtD7vlIAkWmeqAWcBU”,加密後的eqs=“u2sOoEZgaZS/oFkRolp3ouB8PR5ws8VLuA6UkIOcm/sE6V1su3gtWzdYQvnCCEr9/DBil”……
這說明完全不需要那麼複雜了,引數都是固定的,自己準備好就成。
ok,在搜狗再度改版之前,這樣子是完全可以實現的。
不過好像搜狗推出了發爬蟲措施,實際抓資料的時候還是小心一點。