如何用爬蟲攻克令人討厭的百度文庫?(菜鳥向)
天下苦百度文庫久矣!

????不知從何時起,想從百度文庫下載一份文檔都成了非常困難的事情。每當我看到需要的文本而靈感大發(fā),興奮地Ctrl+C、V時,卻發(fā)現(xiàn),誒嘿?。∩兑裁糜??。。。
? ?我氣地抓耳撓腮,想上B站找有什么免費下載器,鋪天蓋地而來的卻是一大堆垃圾宣傳,什么“公眾號”“回復(fù)”之類的。所以迫于無奈只好自己寫了一點點小東西。
重要的事情說三遍:
????下載鏈接在文章末尾!
????下載鏈接在文章末尾!!
????下載鏈接在文章末尾!!!

攻克經(jīng)歷
1.尋找數(shù)據(jù)
? 隨便找一篇百度文庫的文檔。這里就以《2022立秋節(jié)氣的風(fēng)俗及養(yǎng)生知識》(文檔ID:041145275b1b6bd97f192279168884868662b87b)為例,打開F12,在元素界面搜索文檔內(nèi)容,就會發(fā)現(xiàn):啥也搜不到捏??

????????這是因為百度文庫中的文檔都是JavaScript動態(tài)加載的,在瀏覽器(Edge)中關(guān)閉JavaScript后回來看就會發(fā)現(xiàn):

????????順便提一嘴,很多一復(fù)制就彈窗要會員、登錄的網(wǎng)站只要把JS關(guān)了就能隨便復(fù)制了。
????????翻一翻網(wǎng)絡(luò)選項卡,在搜索中搜索文檔內(nèi)容,就能在文檔選項下找到一份文檔:

? ? 這個文檔應(yīng)該對應(yīng)了頁面中加載的文本,所以只有前幾頁已加載的內(nèi)容中的文本.到這一步,已經(jīng)能夠拿到一部分數(shù)據(jù)了,但是 , 做事就要做絕!
????鑒于本人為新手,就開始了為30分鐘的無強度學(xué)習(xí)。東拼西湊的知識,最后ChatGPT告訴我:
????異步加載: 很多現(xiàn)代網(wǎng)站使用異步加載技術(shù),如 AJAX(Asynchronous JavaScript and XML)來實現(xiàn)頁面的動態(tài)更新。通過異步加載,網(wǎng)頁可以在不刷新整個頁面的情況下,只更新部分內(nèi)容,從而提升用戶體驗和頁面加載速度。--------ChatGPT
然后,我嘗試點擊 "展開全文" 按鈕,然后,很快啊,一個新的可疑的請求引起了我的注意:

????分析響應(yīng)的內(nèi)容,就能發(fā)現(xiàn),這是一個json格式的響應(yīng),其中的pageIndex代表了頁碼,pageLoadUrl則代表了每一頁的文本加載的URL,隨便點開一個URL,就能發(fā)現(xiàn)一大堆Unidoce編碼的漢字:
{"c":"\u65b9\u5f0f\u5728\u79cb\u5b63\u683d\u79cd\u7684\u841d\u535c\u662f\u6700\u597d\u5403\u7684\uff0c\u7279\u522b\u662f\u971c\u6253\u4ee5\u540e\u3002\u800c\u4ece\u516b\u6708\u4efd\u4e0b",
用在線工具解碼后就可以發(fā)現(xiàn):

成功!

理論存在,實踐開始!!

程序部分(python)
?經(jīng)典

實驗后發(fā)現(xiàn),上面請求的URL可以簡化為只有文檔id一個參數(shù)的地址,pn為頁數(shù),但是一般免費的文檔都不會超過100頁:
??這里直接用json庫解析數(shù)據(jù)了,把每一頁的URL存入一個列表:
????
請求每一頁的文本,并進行一點文本處理:
使用BeautifulSoup庫處理主頁,取得文檔的標題:
ppt類文檔可獲取圖片:
文件的存儲路徑:
外加一大堆的bug處理...??

重要問題1

然后,
我的程序(屎山),
終于,
初現(xiàn)雛形了!

?成果展示
文本

PPT

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

下載鏈接
源代碼(推薦):https://github.com/TinkerAC/Baiduwenku-downlload.git
藍奏云:https://wwpn.lanzouw.com/iGRFv15e56re
密碼:hj75
(如果你想直接運行的話)

免責(zé)聲明
1. 本腳本僅用于學(xué)習(xí)交流使用。作者不對腳本的任何誤用或濫用承擔任何責(zé)任。
2. 本腳本可能存在錯誤和缺陷,作者不對其準確性、完整性或適用性做出任何保證。
3. 本腳本的使用風(fēng)險由用戶自行承擔。作者不對因使用本腳本而導(dǎo)致的任何損失、損害或問題負責(zé)。
4. 用戶在使用本腳本時,應(yīng)遵守所有適用的法律法規(guī)和道德標準。任何非法或濫用行為均與作者無關(guān)。
5. 本腳本可能會涉及第三方庫、工具或資源,這些資源受到其各自的許可協(xié)議約束。用戶需遵守相關(guān)許可協(xié)議。
請注意,本免責(zé)聲明可能會根據(jù)需要進行調(diào)整和修改。作者保留在任何時候修改免責(zé)聲明的權(quán)利。繼續(xù)使用本腳本將被視為您已經(jīng)同意了任何修改后的免責(zé)聲明。
最后,作者對您使用本程序的結(jié)果不承擔任何責(zé)任。感謝您的理解和合作。

結(jié)尾
????小聲BB:作者第一次寫文章,做的不好還請見諒,好用的話別忘了支持一下哦!
大佬們看一樂就好了,作者的編程水平還有待提升????
歡迎小伙伴們在地下評論留言哦!
(●'?'●)
????