爬蟲案例 下載某文庫付費文檔 全格式


由於版權原因,具體網站不再明述。

爬取思路一:接口

ppt接口為:https://wenku.baidu.com/browse/getbcsurl?doc_id=(文章id) &pn=0&rn=99999&type=ppt

經過測驗發現只能下載vip免費文檔,部分vip專屬文檔是不能下載的

如vip專屬文檔:文章https://wenku.baidu.com/view/cdc02bcc842458fb770bf78a6529647d272834c6.html
對應接口為
https://wenku.baidu.com/browse/getbcsurl?doc_id=cdc02bcc842458fb770bf78a6529647d272834c6&pn=0&rn=99999&type=ppt
里面得到的圖片Url打開啥都沒有滴,但是vip免費文檔是可以用的,
如:https://wenku.baidu.com/view/9712a85429160b4e767f5acfa1c7aa00b52a9d37.html
接口為:https://wenku.baidu.com/browse/getbcsurl?doc_id=9712a85429160b4e767f5acfa1c7aa00b52a9d37&pn=0&rn=99999&type=ppt

將所有數據復制打開json.cn格式化發現鏈接都是正常的,
但是為了爬蟲的穩定性 只能果斷放棄這種方法了哈啊哈~~

爬取思路二:使用自家的請求頭和selenium進行獲取文檔

說一下爬取思路及遇到的問題

  • 爬取付費文檔(大部分含文字)實際使用百度的請求頭對自家進行爬取,可以爬取成功,請求頭可以在robots.txt里找到 參考鏈接

  • xpath抓取的值有空格換行符等問題:使用normalize-space()函數,如contents = html.xpath('//div[normalize-space(@class="bd doc-reader")]/text()')

  • python-pptx 實踐 :添加圖片 參考鏈接如下:https://www.cnblogs.com/shanger/p/13098799.html

  • python-pdf 和 python-docx 實踐參考

  • selenium click無效問題 之前寫過解決辦法,鏈接為https://blog.csdn.net/a12355556/article/details/108346202

  • python 中 for x or y in z:貌似都成立,應該是格式不對,正確寫法是 for x in z or y in z:,但代碼我就是用的錯誤的寫法哈哈哈,因為后面有if判斷用else巧妙的避過去了~~

注意

  • pptx和pdf我是用圖片轉換的,沒有圖片的文檔可轉換不了哦
  • 運行時大家記得改一下chromedriver的路徑哦
  • vip專屬文檔也成功哦~~

爬取結果:
在這里插入圖片描述

代碼

import requests,docx,os
from lxml import etree
from PIL import Image
from urllib import request
from selenium import webdriver


driver_path = r'D:/chromedriver/chromedriver.exe'
header = {'User-agent': 'Baiduspider'}
def download_wenku(url,typ):
    r = requests.get(url , headers = header)
    html = etree.HTML(r.text)
    title = html.xpath('//title/text()')[0][:-5]
    contents = html.xpath('//div[normalize-space(@class="bd doc-reader")]/text()')
    for c in contents:
        if len(c)>50:
            content = c
    
    if ',' or ',' in typ:
        if ',' in typ:
            typs = typ.split(',')
            for typ in typs:
                save_type(typ,title,content,url)
        else:
            typs = typ.split(',')
            for typ in typs:
                save_type(typ,title,content,url)
    if typ=='all':
        a = [save_type(typ,title,content,url) for typ in ['docx','txt','pdf','pptx']]
def save_type(typ,title,content,url):
        
    if typ=='docx':
        print("*"*30+"docx正在下載中"+"*"*30)  
        docu = docx.Document()
        docu.add_paragraph(content)
        docu.save(title+'.docx')
        print("*"*30+"docx類型下載完成"+"*"*30)
    if typ=='txt':
        print("*"*30+"txt正在下載中"+"*"*30)  
        f = open(title+'.txt','w',encoding='utf-8').write(content)
        print("*"*30+"txt類型下載完成"+"*"*30)
    if typ=='pdf':
        print("*"*30+"pdf正在下載中"+"*"*30)  
        save_pdf(title,url)
        print("*"*30+"pdf類型下載完成"+"*"*30)
    if typ=='pptx':
        print("*"*30+"pptx正在下載中"+"*"*30)  
        save_pptx(title,url)
        print("*"*30+"pptx類型下載完成"+"*"*30)

def save_pptx(title,url):
    verify = download_png(url)
    if verify==True:
        return
        # 加載庫
    from pptx import Presentation
    # 設置路徑
    # work_path = old_path+'\img'
    # os.chdir(work_path)

    # 實例化 ppt 文檔對象
    prs = Presentation()

    # 插入幻燈片

    img = os.getcwd()+'\img'
    # 添加圖片
    for i in range(1,len(os.listdir(img))+1):
        blank_slide = prs.slide_layouts[6]
        slide_1 = prs.slides.add_slide(blank_slide)
        img_name  = img+'\\'+ str(i)+'.png'
        slide_1.shapes.add_picture(image_file=img_name,left=1,top=1,)

    # 保存 ppt
    prs.save(title+'.pptx')

def download_png(url):
    try:
        options = webdriver.ChromeOptions()
        options.add_argument('--headless')
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-extensions')
        options.add_argument('--disable-gpu')
        options.add_argument('blink-settings=imagesEnabled=false')
        driver = webdriver.Chrome(executable_path=driver_path,options=options)
        driver.get("https://wenku.baidu.com")
        driver.get(url)
        element = driver.find_element_by_xpath('//span[@class="read-all"]')
        driver.execute_script("arguments[0].click();", element)
        js = "var q=document.documentElement.scrollTop=20000" 
        driver.execute_script(js)
        source = driver.page_source
        html = etree.HTML(source)

        #獲取圖片url
        divs = html.xpath('//div[@class="mod flow-ppt-mod"]/div/div')
        urls = []
        for div in divs:
            url = div.xpath('div/img/@src')
            if len(url)==0:
                url = div.xpath('div/img/@data-src')
            if len(url)!=0:
                urls.append(url[0])

         #創建圖片文件夾並下載圖片     
        if not os.path.exists('img'):
            os.mkdir('img')
        i=1
        for url in urls:
            request.urlretrieve(url,'img/'+str(i)+'.png')
            i = i+1
    except Exception as e:
        print("該文檔無圖片,不適合轉換成pptx和pdf")
        driver.quit()
        return True
    driver.quit()
        
def save_pdf(title,url):
    
    verify = download_png(url)
    if verify==True:
        return
    folderPath = os.getcwd()+'\img'
    filename = title
    files = os.listdir(folderPath)
    jpgFiles = []
    sources = []
    for file in files:
        if 'png' in file:
            jpgFiles.append(file)
    tep = []
    for i in jpgFiles:
        ex = i.split('.')
        tep.append(int(ex[0]))
    tep.sort()
    jpgFiles=[folderPath +'/'+ str(i) + '.png' for i in tep]
    output = Image.open(jpgFiles[0])
    jpgFiles.pop(0)
    for file in jpgFiles:
        img = Image.open(file)
        img = img.convert("P")
        sources.append(img)
    output.save(f"./{filename}.pdf","PDF",save_all=True,append_images=sources)
    
    
    
def main():
    url = input("請輸入要下載的文章鏈接:")
    print("*"*10+"文檔都是圖片建議存為pptx,pdf,均為文字建議存為docx,txt"+"*"*10)
    typ = input("請輸入要保存的類型(可供選擇的類型為doc,txt,pdf,pptx,下載多種格式請用逗號隔開,全部下載可使用all):")
    download_wenku(url,typ)
if __name__ == '__main__':
    main()



免責聲明!

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



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