百度文庫下載須要券,或者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裏面去。