百度文库爬取及PPT制作

今天帮媳妇儿做一个PPT,无奈百度文库没有积分。偶然用一次,如今互联网上哪哪都要充值还得是包月,很烦。
分两步:

  1. 爬取文库的PPT,输出图片,放到一个文件夹中
  2. PPT开发者模式,写一个宏文件,批量创建PPT页并按顺序导入图片

下面是代码:
Python版爬虫脚本,输入参数是URL。PPT版的已经经过测试验证,其他的应该原理都一样,需要的自行验证。
VB版PPT宏脚本,文件夹路径需要自己指定。

import requests
import re
import argparse
import json
import os

# 根据文件决定函数
y = 0
def DOC(url):
    doc_id = re.findall('view/(.*).html', url)[0]
    html = requests.get(url).text
    lists = re.findall('(https.*?0.json.*?)\\\\x22}', html)
    lenth = (len(lists) // 2)
    NewLists = lists[:lenth]
    for i in range(len(NewLists)):
        NewLists[i] = NewLists[i].replace('\\', '')
        txts = requests.get(NewLists[i]).text
        txtlists = re.findall('"c":"(.*?)".*?"y":(.*?),', txts)
        for i in range(0, len(txtlists)):
            global y
            print(txtlists[i][0].encode('utf-8').decode('unicode_escape', 'ignore'))
            if y != txtlists[i][1]:
                y = txtlists[i][1]
                n = '\n'
            else:
                n = ''
            filename = doc_id + '.txt'
            with open(filename, 'a', encoding='utf-8') as f:
                f.write(n + txtlists[i][0].encode('utf-8').decode('unicode_escape', 'ignore').replace('\\', ''))
        print("文档保存在" + filename)


def PPT(url):
    doc_id = re.findall('view/(.*).html', url)[0]
    url = "https://wenku.baidu.com/browse/getbcsurl?doc_id=" + doc_id + "&pn=1&rn=99999&type=ppt"
    html = requests.get(url).text
    lists = re.findall('{"zoom":"(.*?)","page"', html)
    for i in range(0, len(lists)):
        lists[i] = lists[i].replace("\\", '')
    try:
        os.mkdir(doc_id)
    except:
        pass
    for i in range(0, len(lists)):
        img = requests.get(lists[i]).content
        with open(doc_id + '\img' + str(i) + '.jpg', 'wb') as m:
            m.write(img)
    print("PPT图片保存在" + doc_id + "文件夹")


def TXT(url):
    doc_id = re.findall('view/(.*).html', url)[0]
    url = "https://wenku.baidu.com/api/doc/getdocinfo?callback=cb&doc_id=" + doc_id
    html = requests.get(url).text
    md5 = re.findall('"md5sum":"(.*?)"', html)[0]
    pn = re.findall('"totalPageNum":"(.*?)"', html)[0]
    rsign = re.findall('"rsign":"(.*?)"', html)[0]
    NewUrl = 'https://wkretype.bdimg.com/retype/text/' + doc_id + '?rn=' + pn + '&type=txt' + md5 + '&rsign=' + rsign
    txt = requests.get(NewUrl).text
    jsons = json.loads(txt)
    texts = re.findall("'c': '(.*?)',", str(jsons))
    print(texts)
    filename = doc_id + '.txt'
    with open(filename, 'a', encoding='utf-8') as f:
        for i in range(0, len(texts)):
            texts[i] = texts[i].replace('\\r', '\r')
            texts[i] = texts[i].replace('\\n', '\n')

            f.write(texts[i])
    print("文档保存在" + filename)


def FPD(url):
    doc_id = re.findall('view/(.*).html', url)[0]
    url = "https://wenku.baidu.com/browse/getbcsurl?doc_id=" + doc_id + "&pn=1&rn=99999&type=ppt"
    html = requests.get(url).text
    lists = re.findall('{"zoom":"(.*?)","page"', html)
    for i in range(0, len(lists)):
        lists[i] = lists[i].replace("\\", '')
    try:
        os.mkdir(doc_id)
    except:
        pass
    for i in range(0, len(lists)):
        img = requests.get(lists[i]).content
        with open(doc_id + '\img' + str(i) + '.jpg', 'wb') as m:
            m.write(img)
    print("FPD图片保存在" + doc_id + "文件夹")


if __name__ == "__main__":
    PPT("https://wenku.baidu.com/view/361cbd5c7f21af45b307e87101f69e314332fac1.html")


Sub photos()
Dim i As Integer
For i = 1 To 59
    ActiveWindow.View.GotoSlide Index:=ActivePresentation.Slides.Add(Index:=i, Layout:=ppLayoutBlank).SlideIndex
    ActivePresentation.Slides(i).Select
    With ActiveWindow.Selection.SlideRange
        .FollowMasterBackground = msoFalse
        .Background.Fill.UserPicture "D:\img\img" & CStr(i - 1) & ".jpg"
    End With
Next
End Sub

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
由于百度文库使用了反爬虫技术,直接访问页面无法获取到文档内容。因此,我们需要使用一些技巧来爬取百度文库。 一种比较通用的方法是使用Selenium模拟浏览器操作,然后获取页面内容。下面是一个使用Selenium和Chrome浏览器的例子: ```python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = "https://wenku.baidu.com/view/xxxxx.html" # 文档的URL driver = webdriver.Chrome() # 创建一个Chrome浏览器实例 driver.get(url) # 打开网页 # 等待文档加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".reader-txt-layer"))) # 获取文档内容 content = driver.find_element_by_css_selector(".reader-txt-layer").text print(content) # 输出文档内容 driver.quit() # 关闭浏览器 ``` 需要注意的是,由于百度文库的反爬虫技术会检测浏览器的User-Agent,因此我们需要设置Chrome浏览器的User-Agent为某个常见的浏览器,比如Chrome或Firefox: ```python options = webdriver.ChromeOptions() options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3") driver = webdriver.Chrome(options=options) ``` 另外,如果我们需要爬取多个文档,可以使用一个循环遍历不同的URL来实现: ```python urls = ["https://wenku.baidu.com/view/xxxxx.html", "https://wenku.baidu.com/view/yyyyy.html", ...] for url in urls: driver.get(url) # 等待文档加载完成 wait = WebDriverWait(driver, 10) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".reader-txt-layer"))) # 获取文档内容 content = driver.find_element_by_css_selector(".reader-txt-layer").text print(content) # 输出文档内容 driver.quit() ``` 需要注意的是,百度文库每个文档只能免费查看一定数量的页数,超过限制后需要付费才能继续查看。因此,如果你需要爬取整个文档,可能需要多次爬取不同的页面,并将结果拼接起来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值