今天要在百度文庫下一個文檔,由於之前測試,清掉了cookies,所以下載文檔時突然提示登陸(之前一直都是自動登陸,記不住密碼啊……),試了半天才想起來密碼,就打算在分析下。
要說自己對百度文庫也算緣分不淺,當年大二的時候我們工作室接到一個項目,就是采集互聯網的各類電子文檔,以供某公司建立文庫。當時百度雖說還上線不到一年,但是卻已經很有名氣,因此也是我們的重點關注對象。下邊開始分析(只看下載分析直接看(二)就行了):
一、文檔在線展示的實現方式和采集策略
在線文庫普遍采用的技術有兩大類:一是將文檔轉為swf文件,然后頁面用flash展示;二是按照文檔原有結構,生成html結構展示。就我們用戶而言,多數時候更喜歡第二種,給人感覺更直觀一點,但是就實現難度而言,第二種也比較麻煩,原因不多說,想想就知道。
當時在線文庫主要采用的都是flash方式,這種方式既實現方便,又能夠有效的防止文檔被惡意抓取,雖說生成的swf文件很容易拿到,但是對於采集者而言,想得到的往往是文檔內容。那么就真的沒辦法了嗎?其實不然,我們了解下這種方式的實現原理就會發現,絕大多數swf展示文檔都是將文檔每頁生成圖片,然后再生成swf的,那么我們只要通過工具將swf中圖片提取出來(這個自己查資料吧),再通過ocr將文字識別出來就行了。
好吧,我想你看到ocr就沒啥心情在看下去了,這玩意目前免費的還沒幾個靠譜的,那么我們來看下第二種方法。第二種就比較簡單了,因為文檔內容直接嵌入網頁,我們直接提取出來就行了唄,小娃娃都會呢。可是我要說這連第一種都不如,因為有兩個關鍵問題:一是采用這一方式的不多,就百度文庫來說只有一部分文檔是這么實現的,杜宇PPT這一類富文本元素較多的,還是flash實現;二是你即使內容提取出來了,想要按原樣式生成文檔,也很難的。
這也不行,那也不行,那咋着行呢?其實上邊都是廢話,想要文檔,直接下載不就行了。
二、百度文庫文檔下載分析
1、准備好裝備
需要准備好以下裝備:
- 百度賬號
- chrome/firefox
- fiddler2(不是必備,但是用過你就愛不釋手)
- 新建一個txt文件方便記錄信息
2、找到文檔下載鏈接
我們先找個賬號登錄,隨便打開一個不要財富值的文檔(最好大一點,1M以上),F12打調試工具,然后下載文檔,可以看到Network出現很多請求,那么哪個請求時下 載鏈接呢?直接將請求按照Siz e大小排序,你會發現最大的那個請求返回內容特別大,這個就是下載鏈接,請求詳情如下:

請求鏈接:
http://bs.baidu.com/wenku41/%2F1a34b536b85dec92517f7ef702e577b4?sign=MBOT:y1jXjmMD4FchJHFHIGN4z:wL%2Bt8HZ%2B9z7YjU2vGwjLZAJH868%3D&time=1393158775&response-content-disposition=attachment;%20filename=%22%B4%BA%CD%ED%B2%BB%CD%EA%C8%AB%BD%DA%C4%BF%B5%A5.doc%22&response-content-type=application%2foctet-stream
多下載幾個就會發下這三部分是變化的,第一部分搜索文檔頁源碼就能找到,filename后的一眼就能看出來是文件名的url編碼,而第兩部分在原頁面卻找不到,可以想到應該是從服務器返回的,那么我們再來看看其他請求。可以很容易發現有個叫download的請求,這名字很明顯了,我們看下這個請求:

激動人心的時刻來了,在response中,Location就是文檔下載鏈接。那么這個請求有事怎么發起的呢?首先看下請求參數,除了doc_id,其他幾項都找不到,在看下referer,鏈接就是之前的文檔頁,我們在這個頁面搜一下“ downloadToken ”,會驚喜的發現下邊這個表單:
<form name="downloadForm" action="/user/submit/download" method="post" target="runDown"><input name="ct" value="20008" type="hidden" /><input name="doc_id" value="b732f1ee240c844769eaee90" type="hidden" /><input name="retType" value="newResponse" type="hidden" /><input name="sns_type" type="hidden" /> <input type="hidden" name="storage" value="0" /><input type="hidden" name="useTicket" value="0" /> <input type="hidden" name="downloadToken" value="e1de787724d82b8c18c1be98438782eb" /> <input type="hidden" name="sz" value="15872"></form>
到此真相大白:在文檔也點擊下載后,首先用詞表單向download頁發起請求,服務器則會返回文檔的下載地址並跳轉,然后返回文檔流。
3、模擬請求
到這里就用到fiddler2了,我們如下構造請求(這里特地找了一個未下載過需要財富值的,):

執行......然后發現返回code:200,response中沒有Location。那么哪里出問題了呢?我們模擬求情和瀏覽器操作哪一點不一樣呢?登 錄!模擬請求中我們沒有登 錄,直接把瀏覽器中已登錄的cookies貼過來,然后在執行......:

成功!請求download也需要登陸信息,那么如何登陸呢?請參見 模擬百度登錄
此次分析到此結束,代碼就不貼了,照着貼吧登陸改了一個最后請求cookies總是空的,不知道是不是因為跨域需要手動設置cookies,但是按照以上的分析肯定能實現下載的。
