1. 程式人生 > >利用搜狗抓取微信公眾號文章

利用搜狗抓取微信公眾號文章

微信一直是一個自己玩的小圈子,前段時間搜狗推出的微信搜尋帶來了一絲曙光。搜狗搜尋推出了內容搜尋和公眾號搜尋兩種,利用後者可以抓取微信公眾號的最新內容,看了下還是比較及時的。
每個公眾號都有一個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,在搜狗再度改版之前,這樣子是完全可以實現的。
不過好像搜狗推出了發爬蟲措施,實際抓資料的時候還是小心一點。