使用C#訪問百度指數:分析請求/響應數據(1)

看到帖子有網友問如何使用C#程序訪問百度指數(網站的站長對這個指標一定不陌生)。如下圖,顯示了CSDN的用戶關注度和媒體關注度。但很可惜的是,用戶只能通過瀏覽的方式得到某天的指數,如果想批量檢查多個關鍵詞的百度指數,就很麻煩了。而且如果想得到具體每天的數值也不是那麼容易。

正好自己也有需要,所以研究了下,寫了個簡單的Demo實現此功能,歡迎各位朋友指正。

 

由於百度指數是以Flash的形式在客戶端展現出來的,不方便直接取到,開始我以爲要用C#程序和Flash客戶端交互。但按常理,我們需要分析發送客戶度請求是發送到服務器的數據和返回的響應結果(其實基本所有的外掛都是這樣做的)。

 

我使用的抓包工具是HTTP Analyzer,通過查看Post Data,可以看到客戶端是發送了一個Post請求到http://index.baidu.com/gateway.php

發送的數據是一個AMF Message

那麼我們需要研究下我們如何能讓我們的程序發送出相同的請求。

再此之前我們需要了解下AMF的概念,AMF是Adobe公司開發的數據交互和遠程過程調用的協議,全稱爲Action Message Format,很類似於WebService。但WebService傳遞的是XML文本數據,而AMF使用Http傳輸的是二進制數據。

AMF中主要使用的數據類型如下:

我們看下向服務器發送的AMF Message信息,HEX顯示如下

這些二進制數據的分析如下
0003 說明使用的AMF版本,目前AMF有兩個版本,0000 表示 AMF0,0003表示AMF3
0000 表示AMF Header的數量0
0001 表示AMF Body的數量1
0017 表示調用的方法的長度佔23個字節(17的16進制就是23)
接下來
4461 7461 4163 6365 7373 6f72 2e67 6574 496e 6465 7865 73
這23個字節表示調用服務器端的方法是DataAccessor.getIndexes(44的16進制就是68,也就是D,後面不再做類似解釋)
接下來的 00 022f 31 表示target作爲標識實現請求和響應的聯繫,一般是自增整數。00表示數據類型爲Number,02表示長度爲兩個字節,2f 31其實就是/1

00 0000 2d Body的長度爲Number類型,長度爲45

0a 0000 0003 0a表示數組類型(類似於C#中的Dictionary,鍵值對,鍵總是string類型),長度爲3

數組的第一部分
0200 0ce5 a881 e8bf 85e6 9599 e882 b2 02表示字符串類型,0c表示此字符串長度爲12,後面的e5 a881 e8bf 85e6 9599 e882 b2
表示傳遞的數據,可以用下段代碼查看

數組的第二部分
02 0001 30 字符串0,不知道有什麼意義

數組的第三部分
02 0012 3230 3130 2d36 2d31 7c32 3031 302d 362d 3131
長度爲18的字符串,內容爲2010-6-1|2010-6-11

至此,請求的數據我們已經分析完畢,再簡單說下返回的數據(Response Content)


返回的AMF Message當然也包括Header和Body(數組類型)
Body的Target爲/1/onResult
Body的Content包括
key String類型 就是我們傳進去的關鍵詞
area Number類型 0
areaName String類型 可以用上面的代碼看到內容,就是全國
userIndexes String類型 這裏都是百度指數(用戶關注度),用逗號分隔開
mediaIndexes String類型 這裏都是媒體指數(媒體關注度),用逗號分隔開(由於圖中userIndexes 佔位較多,所以未顯示出來,在userIndexes數據下方)

如果想得到最後一天的百度指數,只要找到mediaIndexes前面最後一個逗號後跟的數字即可(當然要排除mediaIndexes本身數據類型及長度的佔位字節)

 

後兩篇請見

使用C#訪問百度指數:模擬發送請求/得到響應數據(2)
使用C#訪問百度指數:處理響應數據(3)

 

 

文章參考
AMF學習1數據類型
AMF學習2遠程調用的封裝

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