百度文库文档下载分析
今天要在百度文庫下一個文檔,由于之前測試,清掉了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,但是按照以上的分析肯定能實現下載的。
轉載于:https://www.cnblogs.com/good-temper/p/3563699.html
總結
以上是生活随笔為你收集整理的百度文库文档下载分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端html小技巧(css篇)—表单美化
- 下一篇: mysql修复表命令_mysql命令修复