百度文檔,用Python一鍵免費下載

百度文庫下載須要券,或者vip才能下載html

 

 

 

 

 

Vip價格高,偶爾下載一次不划算。linux

 

 

 

 

 

不下載複製?很差意思複製也須要vip不然只能一次複製兩行。json

 

 

 

 

 

如何才能以最低成本獲取到百度文庫裏的文檔內容呢?異步

 

固然是用Python啦!工具

 

 

 

接下來教你們如何使用Python免費下載百度文檔。測試

 

因爲百度文庫的內容是經過網頁展現的,那咱們猜他是經過後臺加載進來的。能夠先經過Ctrl+u查看HTML源碼,看源碼裏面是否有文檔數據。很遺憾HTML源碼裏面並無文檔內容。字體

肯定不是經過HTML加載的以後,咱們就能夠大膽的猜想他是經過json異步加載。因此經過F12打開開發者管理工具network抓包,查看頁面加載過程請求的URL。這裏會有大量的請求,可是咱們仔細觀察會發現有一個0.json的URL返回的數據就是文檔的文本數據。url

 

 

 

 

拿到請求文檔數據的URL後須要肯定URL參數。經過查看headers肯定請求方式爲GET請求。請求參數裏x-bce-range和token是變更的,其餘都是固定不變。spa

 

 

 

token這個東西不少時候都會寫入到HTML頁面裏去,用途是防csrf攻擊。可是百度文檔裏面的token有什麼用咱們不用關心,重要的是這個token那裏來。去HTML源代碼裏查看這兩個變量能不能獲取到。3d

 

 

 

 

果真,在HTML源碼裏有一段js代碼,其中就包含了全部請求文檔的URL。看起來有點像,但仍是不同啊!其實這裏是包含了轉移符 \ ,還有一個比較奇怪的 \x22 實際上是一個雙引號。把這段不規範的json數據提取出來替換掉 \ 和 \x22就是一個標準的json格式數據。

 

提取文檔數據URL代碼實現

 

def get_document():

    # 文庫url

    url = "https://wenku.baidu.com/view/eefef92fa1116c175f0e7cd184254b35eefd1a97.html?from=search"

    sess = requests.Session()

    html = sess.get(url).content.decode("gbk")

    # 抓取到文檔標題

    title = re.search('id="doc-tittle-0">(.*?)</span>', html).group(1)

    # 使用正則提取 文檔內容的url

    res = re.search("WkInfo.htmlUrls = '(.*)'", html).group(1)

    # \\x22是linux中的引號,替換成Python中的引號

    res = res.replace("\\x22", "\"")

    # 轉成字典

    data = json.loads(res)

 

拿到URL以後繼續發送請求獲取文檔數據,文檔數據是分段保存到json裏面的,json裏面的數據以下圖所示。

 

 

 

字段解釋:

         c: 數據

         p: 位置

         r: 暫時不肯定做用

         s: 字體樣式

         t: 數據格式(word文本,pic圖片)

         ps: 樣式,_enter:1  表示換行,同一段的文本ps值爲空

 

因爲圖片加載比較特殊,有時候可能經過一個請求加載兩張圖片,很差肯定圖片的位置,因此這裏暫且不考慮圖片,咱們只抓取文本。

 

 

def get_document():

 

# ....省略前面代碼

 

    # 新建一個文檔

    document = Document()

    string = ""

    for i in data["json"]:

        url = i["pageLoadUrl"]  # 獲取到url

        url = url.replace("\\", "")  # url中有轉義符\去掉

        # 請求文檔內容

        data = requests.get(url).content.decode("utf-8")

        # 提取文本數據

        res = re.search("wenku_\d*\((.*)\)", data, re.S).group(1)

        # 將json對象數據轉成Python對象

        data = json.loads(res)

        for i in data['body']:

            # 判斷數據是什麼類型

            if i["t"] == "word":

                # 獲取到文本

                string += str(i["c"])

                # ps中不爲空而且_enter==1的時候是換行也就是一段內容

                if i["ps"] and i["ps"].get("_enter") == 1:

                    document.add_paragraph(string)  # 將一段內容寫入到word

                    string = ""  # 從新複製 "" 表示新的一段文本

    # 保存word

    document.save(title + ".docx")

 

到這裏就已經能夠把一個百度文檔的文本內容完整下載下來。

網上隨機選一篇文檔來測試效果,純文本的文檔效果賊好。缺點就是不能同時下載圖片插入到word裏面去。

 

 

相關文章
相關標籤/搜索