Python百度文庫爬蟲終極版


百度文庫爬蟲

  1. Python百度文庫爬蟲之txt文件
  2. Python百度文庫爬蟲之doc文件
  3. Python百度文庫爬蟲之pdf文件
  4. Python百度文庫爬蟲之ppt文件
  5. [Python百度文庫爬蟲之xls文件
  6. Python百度文件爬蟲終極版

我們在開始爬蟲之前,首先要了解網頁的信息和結構,然后獲取請求的url和參數(payloads)來得到所要的數據並處理。接下來我們根據:

  • 一.網頁分析
  • 二.爬蟲編寫
  • 三.運行與結果
  • 四.程序改善

一.網頁分析

1.初步分析

我們首先以.txt文本文件來分析網站,從簡單到復雜,從txt—>word—pdf等

我們以<<一個循環網絡爬蟲>>進行說明

from IPython.display import Image
Image("./Images/1.png",width="600px",height="400px")

在這里插入圖片描述

from IPython.display import Image
Image("./Images/0.png",width="600px",height="400px")

在這里插入圖片描述

該百度文庫的網址為:鏈接

URL:https://wenku.baidu.com/view/9a41886f26d3240c844769eae009581b6bd9bd6e.html?fr=search

查看該網頁的源代碼,並沒有我們所要的文本數據,但是有我們需要的參數如下:

  • title:文件主題
  • docId:文件id。這個參數很重要,我們下一步需要它跳轉到其他網址
  • docType:文件類型
from IPython.display import Image
Image("./Images/2.png",width="600px",height="400px")

在這里插入圖片描述

前提說明:對於上面數據的獲取需要re正則表達式,對於別的網頁分析器,比如lxml,bs4等不適合這樣格式的數據。對於正則表達式的學習,可以參考鏈接:正則表達式

既然上個url中沒有我們需要的數據,那么我們進行瀏覽器Network進行調試,尋找我們需要的數據。我們要明白一點,數據不可能無緣無故的出現在網頁中,肯定存在url將數據發送過來,此數據格式大概率為JSON

2.數據發現

經過url的查找,我們終於找到我們需要的數據鏈接

from IPython.display import Image
Image("./Images/3.png",width="600px",height="400px")

在這里插入圖片描述

上面url所需的參數如下:

  • md5sum: de679a1e4f76df8ac8366bd7663285d6
  • sign: 91f37496c3
  • callback: cb
  • pn: 1
  • rn: 4
  • type: txt
  • rsign: p_4-r_0-s_896f2
  • _: 1587883180674
from IPython.display import Image
Image("./Images/4.png",width="600px",height="400px")

在這里插入圖片描述

將以上兩個重要的URL進行對比:
https://wenku.baidu.com/view/9a41886f26d3240c844769eae009581b6bd9bd6e.html?fr=search
https://wkretype.bdimg.com/retype/text/9a41886f26d3240c844769eae009581b6bd9bd6e?md5sum=de679a1e4f76df8ac8366bd7663285d6&sign=91f37496c3&callback=cb&pn=1&rn=4&type=txt&rsign=p_4-r_0-s_896f2&_=1587886244900

觀察發現,其中文章的id(“9a41886f26d3240c844769eae009581b6bd9bd6e”)是一樣的,但是文件內容還有幾個參數(如md5sum,sign,rsgin,callback,pn等)

看看需獲取文字詳情的參數應該通過某個接口請求到的。按時間的順序往上找,我們發現一個接口包括了需要的md5sum,sign,rsign等參數。其url為:https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id=9a41886f26d3240c844769eae009581b6bd9bd6e&t=1587886245267&_=1587886244899

from IPython.display import Image
Image("./Images/5.png",width="600px",height="400px")

在這里插入圖片描述

from IPython.display import Image
Image("./Images/6.png",width="600px",height="400px")

在這里插入圖片描述

  • md5sum: de679a1e4f76df8ac8366bd7663285d6(已獲取)
  • sign: 91f37496c3(已獲取)
  • callback: cb
  • pn: 1
  • rn: 4
  • type: txt(已獲取)
  • rsign: p_4-r_0-s_896f2(已獲取)
  • _: 1587883180674

3.其他參數

通過上面的數據獲取,我們還有以下參數未獲取:

  • callback: cb
  • pn: 1
  • rn: 4
  • _: 1587883180674

callback參數是不變的為cb,pn為頁數相關的,_可以猜到這個是類似時間戳的參數,對於這種前后關聯的請求,處理時一般使用Requests的Session

session=requests.session()
session.get(url).content.decode('gbk')

對此我們網頁信息分析和參數獲取過程已經完畢,接下來我們進行程序編程

二.爬蟲編寫

首先我們編程實現爬取過程,先進行過程調試,然后進行函數編程

通過上面的分析,整個百度文庫的爬取過程可以總結為請求百度文庫URL,判斷文章類型,請求getcodeinfo接口相關參數,請求百度文庫正文接口

1.請求百度文庫URL

import requests
import re
import json
import os

session=requests.session()
url=input("請輸入要下載的文庫URL地址:")
請輸入要下載的文庫URL地址: https://wenku.baidu.com/view/9a41886f26d3240c844769eae009581b6bd9bd6e.html?fr=search
content=session.get(url).content.decode('gbk')
pattern=re.compile('view/(.*?).html')
res=pattern.findall(url)[0]
res
'9a41886f26d3240c844769eae009581b6bd9bd6e'
doc_id=re.findall('view/(.*?).html',url)[0]
doc_id
'9a41886f26d3240c844769eae009581b6bd9bd6e'

2.判斷文章類型

types=re.findall(r"'docType.*?\':.*?\'(.*?)\',",content)[0]
types
'txt'
title=re.findall(r"'title.*?\':.*?\'(.*?)\',",content)[0]
title
'一個循環網絡爬蟲'

3.請求getcodeinfo接口相關參數

content_url='https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id={}'.format(doc_id)
content_url
'https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id=9a41886f26d3240c844769eae009581b6bd9bd6e'
content=session.get(content_url).content.decode('gbk')
md5sum=re.findall('"md5sum":"(.*?)"',content)[0]
md5sum
'&md5sum=de679a1e4f76df8ac8366bd7663285d6&sign=91f37496c3'
pn=re.findall('"totalPageNum":"(.*?)"',content)[0]
pn
'4'
rsign=re.findall('"rsign":"(.*?)"',content)[0]
rsign
'p_4-r_0-s_896f2'

4.請求百度文庫正文接口

content_url='https://wkretype.bdimg.com/retype/text/'+doc_id+'?rn='+pn+'&type='+types+md5sum+'&rsign='+rsign
content=json.loads(session.get(content_url).content.decode('utf-8'))
result=''

for item in content:
    for i in item['parags']:
        result+=i['c'.replace('\\r','\r').replace('\\n','\n')]
filename=title+'.txt'

with open(filename,'w',encoding='utf-8') as f:
    f.write(result)
    
f.close()
from IPython.display import Image
Image("./Images/7.png",width="600px",height="400px")

在這里插入圖片描述

5.其他類型(doc)

對於doc文件的爬取,我們方法類型,只是提取https.?0.json.?)\\x22樣式的url即對應doc每頁的數據

from IPython.display import Image
Image("./Images/8.png",width="600px",height="400px")

在這里插入圖片描述

url=input("請輸入要下載的文庫URL地址:")

content=session.get(url).content.decode('gbk')
doc_id=re.findall('view/(.*?).html',url)[0]
types=re.findall(r"'docType.*?\':.*?\'(.*?)\',",content)[0]
title=re.findall(r"'title.*?\':.*?\'(.*?)\',",content)[0]
請輸入要下載的文庫URL地址: https://wenku.baidu.com/view/7cf966a96429647d27284b73f242336c1fb93044.html?fr=search
url_list=re.findall('(https.*?0.json.*?)\\\\x22}',content)
url_list=[addr.replace("\\\\\\/","/") for addr in url_list]
url_list[1]
'https://wkbjcloudbos.bdimg.com/v1/docconvert132//wk/62c22f05e9429cd4f65b8c4b36b89070/0.json?responseCacheControl=max-age%3D3888000&responseExpires=Wed%2C%2010%20Jun%202020%2017%3A17%3A46%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2020-04-26T09%3A17%3A46Z%2F3600%2Fhost%2Fe94d9f08d4c9308a4b340a524b8c56a52e1624c8d19144de37f052db510e001c&x-bce-range=9816-20599&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU4Nzg5NjI2NiwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDYWNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.wX1KXsaKGWwgIukv8kOvn8PFne2TNtDkf2Zy%2FG%2BSaAI%3D.1587896266'
content=session.get(url_list[1]).content.decode('gbk')
txtlist=re.findall('"c":"(.*?)".*?"y":(.*?),',content)
y=0
result=''
for item in txtlist:
    if not y==item[1]:
        y=item[1]
        n='\n'
    else:
        n=''
    result+=n
    result+=item[0].encode('utf-8').decode('unicode_escape','ignore')
E:\Anaconda\envs\mypython\lib\site-packages\ipykernel_launcher.py:10: DeprecationWarning: invalid escape sequence '\/'
  # Remove the CWD from sys.path while we load stuff.
result
'\n八爪魚·雲采集服務平台 \nwww.bazhuayu.com \n \n \n \n爬蟲技術入門教程推薦 \n \n首先我們要掌握爬蟲相關知識點: \n爬蟲之從入門到精通(https:\\/\\/zhuanlan.zhihu.com\\/p\\/25296437) \n1、爬蟲的介紹 \n2、HTTP協議的講解 \n3、爬蟲環境的搭建 \n4、爬蟲之網頁下載 \n5、爬蟲之解析 \n6、Headers的詳細講解 \n7、爬蟲之存貯 \n8、爬蟲之異步加載 \n9、爬蟲之多線程 \n10、scrapy的基本介紹 \n11、scrapy的正確編寫方式 \n12、scrapy之下載中間件 \n13、scrapy之技巧 \n14、scrapy之分布式 \n15、爬蟲總結及反爬蟲技巧 '

result=''
for url in url_list[:-5]:
    content=session.get(url).content.decode('gbk')
    y=0
    txtlist=re.findall('"c":"(.*?)".*?"y":(.*?),',content)
    for item in txtlist:
        if not y==item[1]:
            y=item[1]
            n='\n'
        else:
            n=''
        result+=n
        result+=item[0].encode('utf-8').decode('unicode_escape','ignore')
E:\Anaconda\envs\mypython\lib\site-packages\ipykernel_launcher.py:13: DeprecationWarning: invalid escape sequence '\/'
  del sys.path[0]
filename=title+".txt"

with open(filename,"w",encoding="utf-8") as f:
    f.write(result)
    
f.close()

6.其他類型(ppt)

數據說明,ppt的每頁數據實質就是一張圖片,我們獲取每張圖片就行

import requests
import re
import json

session=requests.session()

url=input("請輸入要下載的文庫URL地址:")

content=session.get(url).content.decode('gbk')
doc_id=re.findall('view/(.*?).html',url)[0]
types=re.findall(r"'docType.*?\':.*?\'(.*?)\',",content)[0]
title=re.findall(r"'title.*?\':.*?\'(.*?)\',",content)[0]
請輸入要下載的文庫URL地址: https://wenku.baidu.com/view/b906673ed1d233d4b14e852458fb770bf68a3b18.html?fr=search
from IPython.display import Image
Image("./Images/9.png",width="600px",height="400px")

在這里插入圖片描述

content_url='https://wenku.baidu.com/browse/getbcsurl?doc_id='+doc_id+"&pn=1&rn=99999&type=ppt"
content=session.get(content_url).content.decode('gbk')
url_list=re.findall('{"zoom":"(.*?)","page"',content)
url_list=[item.replace("\\",'') for item in url_list]
import os

if not os.path.exists(title):
    os.mkdir(title)
    
for index,url in enumerate(url_list):
    content=session.get(url).content
    path=os.path.join(title,str(index)+'.jpg')
    with open(path,'wb') as f:
        f.write(content)
        
print("圖片保存在"+title+"文件夾")
圖片保存在精品課件-爬蟲技術文件夾

前提說明:對於以下文件類型,我們無法保存成對應的文件類型,但可以獲取其數據內容

7.其他類型(pdf)

url=input("請輸入要下載的文庫URL地址:")

content=session.get(url).content.decode('gbk')
doc_id=re.findall('view/(.*?).html',url)[0]
types=re.findall(r"'docType.*?\':.*?\'(.*?)\',",content)[0]
title=re.findall(r"'title.*?\':.*?\'(.*?)\',",content)[0]
請輸入要下載的文庫URL地址: https://wenku.baidu.com/view/5fd3a55b3d1ec5da50e2524de518964bcf84d2b6.html?fr=search
url_list=re.findall('(https.*?0.json.*?)\\\\x22}',content)
url_list=[addr.replace("\\\\\\/","/") for addr in url_list]
result=""
for url in url_list[:-5]:
    content=session.get(url).content.decode('gbk')
    txtlists=re.findall(r'"c":"(.*?)",',content)
    
    y=0
    for item in txtlists:
        result+=item.encode('utf-8').decode('unicode_escape','ignore')
        if y%10==0:
            result+="\n"
        
            
        y+=1
E:\Anaconda\envs\mypython\lib\site-packages\ipykernel_launcher.py:8: DeprecationWarning: invalid escape sequence '\/'
file_name=title+".txt"

with open(file_name,"w",encoding="utf-8") as f:
    f.write(result)
    
f.close()

8.其他類型(xls)

url=input("請輸入要下載的文庫URL地址:")

content=session.get(url).content.decode('gbk')
doc_id=re.findall('view/(.*?).html',url)[0]
types=re.findall(r"'docType.*?\':.*?\'(.*?)\',",content)[0]
title=re.findall(r"'title.*?\':.*?\'(.*?)\',",content)[0]
請輸入要下載的文庫URL地址: https://wenku.baidu.com/view/68d81664ddccda38376baffa.html?fr=search
url_list=re.findall('(https.*?0.json.*?)\\\\x22}',content)
url_list=[addr.replace("\\\\\\/","/") for addr in url_list]
set(url_list)
{'https://wkbjcloudbos.bdimg.com/v1/docconvert5099//wk/f3f81bcf705d88d1e845dc6b10429cd0/0.json?responseCacheControl=max-age%3D3888000&responseExpires=Wed%2C%2010%20Jun%202020%2023%3A15%3A31%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2020-04-26T15%3A15%3A31Z%2F3600%2Fhost%2F51e585a7f2fc296ffaf3c75e221ed2226c5305d9827351e11869580041938259&x-bce-range=0-9453&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU4NzkxNzczMSwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDYWNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.E8J4bCHGAEMVRJAUwfGRrZcNrs6CJJftvA8QsrnwUhI%3D.1587917731',
 'https://wkbjcloudbos.bdimg.com/v1/docconvert5099//wk/f3f81bcf705d88d1e845dc6b10429cd0/0.json?responseCacheControl=max-age%3D3888000&responseExpires=Wed%2C%2010%20Jun%202020%2023%3A15%3A31%20%2B0800&authorization=bce-auth-v1%2Ffa1126e91489401fa7cc85045ce7179e%2F2020-04-26T15%3A15%3A31Z%2F3600%2Fhost%2F51e585a7f2fc296ffaf3c75e221ed2226c5305d9827351e11869580041938259&x-bce-range=9454-&token=eyJ0eXAiOiJKSVQiLCJ2ZXIiOiIxLjAiLCJhbGciOiJIUzI1NiIsImV4cCI6MTU4NzkxNzczMSwidXJpIjp0cnVlLCJwYXJhbXMiOlsicmVzcG9uc2VDYWNoZUNvbnRyb2wiLCJyZXNwb25zZUV4cGlyZXMiLCJ4LWJjZS1yYW5nZSJdfQ%3D%3D.JYFSUrHr%2B2QZYm8uZJc0PADkcF%2BzEhvIraQUJuDUA4w%3D.1587917731'}
result=""
for url in url_list[:-2]:
    content=session.get(url).content.decode('gbk')
    txtlists=re.findall(r'"c":"(.*?)",',content)
    
    y=0
    for item in txtlists:
        result+=item.encode('utf-8').decode('unicode_escape','ignore')
        if y%10==0:
            result+="\n"
        
            
        y+=1
result
'接口名稱\nHTTP爬蟲接口接口技術描述通過WEB爬蟲抓取特定URL對象,按HTML格式存儲入無線城市內容庫。無線城市模擬用戶行為訪問數據源查詢頁面,發出請求,得到HTML結果后,轉換呈現。針對數據源能力,進行調用封裝,提供HTTP請求和消息返\n回,通常是XML返回格式。同上,請求方式為WebService方式。適用采集時間適用數據量粒度非實時,小時網頁形式,百、天、周、月兆以下\n即時百K以下HTTP透傳接口HTTP調用接口即時百K以下WebService調用接口即時通常百K以下FTP接口\n無線城市作為FTP客戶端或者服務端,取得或接受數據源的數文件形式,數非實時,小時據文件,文件格式通常為XML或據量基本無限、天、周、月CSV。可能會需要WebService調制用接口傳遞控制消息。\n無線城市直接連接數據源系統數據庫系統取得數據。非實時,分鍾SQL,數據量基、小時、天、本無限制周、月非實時,分鍾文件形式,數、小時、天、\n據量基本無限周、月制DB接口本地文件接口對於傳遞到本地的文件,裝載到無線城市系統。業務形式\n固定、半固定信息查詢類應用即時查詢類應用即時查詢類,即時服務調用類應用。即時查詢類,即時服務調用\n類應用。離線信息查詢,固定、半固定信息支持。離線信息查詢,固定、半固定信息支持。離線信息查\n詢,固定、半固定信息支持。數據源狀況要求示例不區分字段有WEB網站公開信息。無登錄、驗證碼等。無婦嬰保健需特別開發。\n有WEB網站公開查詢接公積金查詢口。無需特別開發。需要針對服務接口進行支付平台支付開發。接口需要針對服務接口進行目前還沒有此開發。\n類接口明確交互字段需要針對服務接口進行影院信息查詢開發。無需特別開發,需要公開數據庫和相關文檔。對數據源系統安全影響較大。此方式並不完全。從數\n據源到無線城市的數據傳遞可能有多種方法,如人工傳遞、MAIL等1.拷盤形式也是。從服務器上以文件內容FTP接口獲得2.約定上傳文件的格式要求\n目前還沒有此類接口目前還沒有此類接口數據內容夠不夠'
file_name=title+".txt"

with open(file_name,"w",encoding="utf-8") as f:
    f.write(result)
    
f.close()

三.運行與結果

import requests
import json
import re
import os
import warnings

warnings.filterwarnings('ignore')

session=requests.session()

path="F:\\桌面\\Files"

if not os.path.exists(path):
    os.mkdir(path)

def parse_txt1(code,doc_id):
    
    content_url='https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id='+doc_id

    content=session.get(content_url).content.decode(code)
    md5sum=re.findall('"md5sum":"(.*?)",',content)[0]
    rsign=re.findall('"rsign":"(.*?)"',content)[0]
    pn=re.findall('"totalPageNum":"(.*?)"',content)[0]
    
    content_url='https://wkretype.bdimg.com/retype/text/'+doc_id+'?rn='+pn+'&type=txt'+md5sum+'&rsign='+rsign
    content=json.loads(session.get(content_url).content.decode('gbk'))
    
    result=''

    for item in content:
        for i in item['parags']:
            result+=i['c']
            
    return result

def parse_txt2(content,code,doc_id):
    md5sum=re.findall('"md5sum":"(.*?)",',content)[0]
    rsign=re.findall('"rsign":"(.*?)"',content)[0]
    pn=re.findall('"show_page":"(.*?)"',content)[0]
    
    content_url='https://wkretype.bdimg.com/retype/text/'+doc_id+'?rn='+pn+'&type=txt'+md5sum+'&rsign='+rsign
    content=json.loads(session.get(content_url).content.decode('utf-8'))
    
    result=''

    for item in content:
        for i in item['parags']:
            result+=i['c']
            
    return result

def parse_doc(content):
    
    url_list=re.findall(r'(https.*?0.json.*?)\\x22}',content)
    url_list=[addr.replace("\\\\\\/","/") for addr in url_list]
    
    result=""

    for url in set(url_list):
        content=session.get(url).content.decode('gbk')

        y=0
        txtlists=re.findall(r'"c":"(.*?)".*?"y":(.*?),',content)
        for item in txtlists:
            # 當item[1]的值與前面不同時,代表要換行了
            if not y==item[1]:
                y=item[1]
                n='\n'
            else:
                n=''
            result+=n
            result+=item[0].encode('utf-8').decode('unicode_escape','ignore')
    
    return result

def parse_pdf(content):
    
    url_list=re.findall(r'(https.*?0.json.*?)\\x22}',content)
    url_list=[addr.replace("\\\\\\/","/") for addr in url_list]
    
    result=""

    for url in set(url_list):
        content=session.get(url).content.decode('gbk')

        y=0
        txtlists=re.findall(r'"c":"(.*?)".*?"y":(.*?),',content)
        for item in txtlists:
            # 當item[1]的值與前面不同時,代表要換行了
            if not y==item[1]:
                y=item[1]
                n='\n'
            else:
                n=''
            result+=n
            result+=item[0].encode('utf-8').decode('unicode_escape','ignore')
    
    return result


def parse_ppt1(doc_id,title):
    
    content_url='https://wenku.baidu.com/browse/getbcsurl?doc_id='+doc_id+'&pn=1&rn=9999&type=ppt'
    content=session.get(content_url).content.decode('gbk')
    
    url_list=re.findall('{"zoom":"(.*?)","page"',content)
    url_list=[addr.replace('\\','') for addr in url_list]
    
    path="F:\\桌面\\Files"+"\\"+title

    if not os.path.exists(path):
        os.mkdir(path)
    
    for index,url in enumerate(url_list):
        content=session.get(url).content
        paths=os.path.join(path,str(index)+'.jpg')
    
        with open(paths,'wb') as f:
            f.write(content)
    print("圖片保存在"+title+"文件夾")
    
def parse_ppt2(content,title):
    
    url_list=re.findall(r'(https:\\\\/\\\\/wkretype.bdimg.com.*?\d+)\\",',content)
    url_list=[addr.replace('\\\\/','/') for addr in url_list]
    
    path="F:\\桌面\\Files"+"\\"+title

    if not os.path.exists(path):
        os.mkdir(path)
    
    for index,url in enumerate(url_list3):
        content=session.get(url).content
        paths=os.path.join(path,str(index)+'.jpg')
    
    
        with open(paths,'wb') as f:
            f.write(content)
    print("圖片保存在"+title+"文件夾")
    
    
def parse_xls(content):
    
    url_list=re.findall(r'(https.*?0.json.*?)\\x22}',content)
    url_list=[addr.replace("\\\\\\/","/") for addr in url_list]
    
    result=""

    for url in set(url_list):
        content=session.get(url).content.decode('gbk')

        y=0
        txtlists=re.findall(r'"c":"(.*?)".*?"y":(.*?),',content)
        for item in txtlists:
            # 當item[1]的值與前面不同時,代表要換行了
            if not y==item[1]:
                y=item[1]
                n='\n'
            else:
                n=''
            result+=n
            result+=item[0].encode('utf-8').decode('unicode_escape','ignore')
            
    result=result.replace("\udb80","").replace("\udc00","")
    
    return result
    
def save_file(title,filename,content):
    
    with open(filename,'w',encoding='utf-8') as f:
        f.write(content)
        print("文件"+title+"保存成功")
    f.close()
    

def main():
    
    print("歡迎來到百度文庫文件下載:")
    print("-----------------------\r\n")
     
    
    while True:
        try:
            print("1.doc \n 2.txt \n 3.ppt \n 4.xls\n 5.ppt\n")
            types=input("請輸入需要下載文件的格式(0退出):")

            if types=="0":
                break

            if types not in ['txt','doc','pdf','ppt','xls']:
                print("抱歉文件格式錯誤,請重新輸入!")
                continue


            url=input("請輸入下載的文庫URL地址:")

            # 網頁內容
            response=session.get(url)

            code=re.findall('charset=(.*?)"',response.text)[0]

            if code.lower()!='utf-8':
                code='gbk'

            content=response.content.decode(code)

            # 文件id
            doc_id=re.findall('view/(.*?).html',url)[0]
            # 文件類型
            #types=re.findall(r"docType.*?:.*?'(.*?)'",content)[0]
            # 文件主題
            #title=re.findall(r"title.*?:.*?'(.*?)'",content)[0]

            if types=='txt':
                md5sum=re.findall('"md5sum":"(.*?)",',content)
                if md5sum!=[]:
                    result=parse_txt2(content,code,doc_id)
                    title=re.findall(r'<title>(.*?). ',content)[0]
                    #filename=os.getcwd()+"\\Files\\"+title+'.txt'
                    filename=path+"\\"+title+".txt"
                    save_file(title,filename,result)
                else: 
                    result=parse_txt1(code,doc_id)
                    title=re.findall(r"title.*?:.*?'(.*?)'",content)[0]
                    #filename=os.getcwd()+"\\Files\\"+title+'.txt'
                    filename=path+"\\"+title+".txt"
                    save_file(title,filename,result)
            elif types=='doc':
                title=re.findall(r"title.*?:.*?'(.*?)'",content)[0]
                result=parse_doc(content)
                filename=path+"\\"+title+".doc"
                save_file(title,filename,result)
            elif types=='pdf':
                title=re.findall(r"title.*?:.*?'(.*?)'",content)[0]
                result=parse_pdf(content)
                filename=path+"\\"+title+".txt"
                save_file(title,filename,result)
            elif types=='ppt':
                link=re.findall('wkretype',content)
                
                if link==None:
                    title=re.findall(r"title.*?:.*?'(.*?)'",content)[0]
                    parse_ppt1(doc_id,title)
                else:
                    title=title=re.findall(r'<title>(.*?)</title>',content)[0]
                    parse_ppt2(content,title)
                    
                
            elif types=='xls':
                title=re.findall(r"title.*?:.*?'(.*?)'",content)[0]
                result=parse_xls(content)
                filename=path+"\\"+title+".txt"
                save_file(title,filename,result)
                
                
        except Exception as e:
            print(e)


if __name__=='__main__':
    main()
歡迎來到百度文庫文件下載:
-----------------------

1.doc 
 2.txt 
 3.ppt 
 4.xls
 5.ppt



請輸入需要下載文件的格式(0退出): ppt
請輸入下載的文庫URL地址: https://wenku.baidu.com/view/bafb70ab82c4bb4cf7ec4afe04a1b0717fd5b3bf.html?fr=search


圖片保存在爬蟲技術ppt課件 - 百度文庫文件夾
1.doc 
 2.txt 
 3.ppt 
 4.xls
 5.ppt



請輸入需要下載文件的格式(0退出): doc
請輸入下載的文庫URL地址: https://wenku.baidu.com/view/0ee9fbc585868762caaedd3383c4bb4cf7ecb78f.html?fr=search


文件爬蟲技術是什么保存成功
1.doc 
 2.txt 
 3.ppt 
 4.xls
 5.ppt



請輸入需要下載文件的格式(0退出): xls
請輸入下載的文庫URL地址: 0


Invalid URL '0': No schema supplied. Perhaps you meant http://0?
1.doc 
 2.txt 
 3.ppt 
 4.xls
 5.ppt



請輸入需要下載文件的格式(0退出): 0

具體效果演示,可以看前面的幾篇文章了解

四.程序改善

雖然文件內容可以下載下來,但是除了txt文件和doc文件,ppt文件外,pdf文件和xls文件無法做到與原文件排版一樣

五.程序打包

使用pyinstaller將程序打包成可執行文件(.exe)文件,下載鏈接見文末

六.代碼鏈接

Github項目鏈接鏈接
執行文件
鏈接:https://pan.baidu.com/s/15zLxVxrtE3ILGeFeKxIWBw
提取碼:lw77 在這里插入圖片描述

from IPython.display import Image
Image("./Images/wenku.png",width="600px",height="400px")

在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM