爬取某ppt素材网站的会员素材

网站

https://www.officeplus.cn/PPT

简介

同第一ppt,这个网站大部分ppt资源免费。部分资源付费。我试着爬的时候发现它不像某些网站只放部分ppt图片,而是把所有ppt图片都放到网站源代码里。这对于爬虫爱好者来说非常友好,我们不用分析就能获取到我们想要的数据。代码有不了解的地方可以私信或者在评论区里问哦

d2b5ca33bd231045

思路

会员的ppt文件我们自然爬取不到,但是我们可以把爬取到的ppt文件照片转换成pdf文件,再把多张pdf文件合并成一张pdf文件,之后把合并后的pdf文件转换成ppt文件,这个代码已经实现了把爬取到的图片转pdf文件并且合并成一张pdf文件了,至于为什么不一步到位是由于小编也是python初学者,能力有限

使用

运行代码,输入要爬取的上面网站的会员链接

实现过程

助力工具:chatgpt、GitHub Copilot

  1. 先导入模块;Identity模块是我自己写的user-agent,不想下载这个模块的把它删了改成你的user-agent就行,后面内容会提示
    import requests
    import os
    from PyPDF2 import PdfMerger
    from Identity.Information import H
    from PIL import Image
    from bs4 import BeautifulSoup
  2. 创建一个叫main的类(看这篇文章写的可以不用创建),传入url和headers,用__init__函数实例化url和user-agent,,后面一些代码要调用它
    class main():
    
        def __init__(self,url,heades):
    
            self.url = url
    
            self.header = heades
  3. 在类main()里面创建一个获取url源代码的函数,我的命名是getImg,也就是def gteImg(self):。调用url,并且获取到url的源代码,用bs4模块中的BeautifulSoup模块解析url源代码的内容获取到照片链接。问:怎么知道照片的连接在哪里呢?答:简单,在这个网站的会员素材网页上按快捷键‘f12’或者在页面上右键,点击‘检查

    d2b5ca33bd234909

    之后看到以下这个界面,在面板里找到‘元素’,点击元素面板里左上角,之后点击图片的位置即可看到图片的链接

    d2b5ca33bd235410

    d2b5ca33bd235954问:怎么知道它有没有在源代码里呢?如第一张图,右键点击查看源代码,在检查的上方,之后搜索url链接关键字,如上图的url,我们在源代码界面按键盘快捷键ctrl+f,粘贴url关键字,发现它是有数据的,就说明url链接在源代码里

    d2b5ca33bd000839

    用requests模块的get请求对这个网址发送请求,参数是url和headers

    htmldata = requests.get(url=self.url,headers=self.header)

    因为用的BeautifulSuop解析,所以得给它加编码方式,不加有的地方可能会乱码

    htmldata.encoding = 'utf-8'

    之后的代码是BeautifulSoup模块的使用,感兴趣的自行网上了解

    html = BeautifulSoup(htmldata.text,'lxml')
    
    imgData = html.select('div[class="swiper-wrapper"] div  img')

    先获取url数据再去重,正如你们所见,在源代码搜索图片链接关键字时有3个结果,说明它解析到3条一样的链接。

    urldata = []
    
            for imgurl in imgData:
    
                imgurl = imgurl.get('src')
    
                if imgurl not in urldata:
    
                    urldata.append(imgurl)

    获取图片,把它保存的本地

    for it,url in enumerate(urldata):
    
                imgcontent = requests.get(url=url,headers=self.header).content
    
                loadfile = f'{filename}/{it+1}.png'
    
                with open(f'{filename}/{it+1}.png','wb') as f:
    
                    f.write(imgcontent)

    把下载后的图片转换成pdf,并删掉这些图片

    def convert_to_pdf(self,path,name):
    
            img_path = path
    
            pdf_path = f'{filename}/{name+1}.pdf'
    
            img = Image.open(img_path)
    
            img.save(pdf_path, "PDF", resolution=100.0)
    
            os.remove(img_path)
    
            print('正在转换第{}张图片'.format(name+1))

    把转换后的pdf文件合并成一个pdf文件并删掉多余的pdf文件

    def merge_pdf(self):
    
            merger = PdfMerger()
    
            n = 0
    
            for i in range(1, len(os.listdir(filename))):
    
                merger.append(f'{filename}/{i}.pdf')
    
                n += 1
    
            merger.write(f'{filename}/{n}.pdf')
    
            merger.close()
    
            for i in range(1, len(os.listdir(filename))):
    
                if i != n:
    
                    os.remove(f'{filename}/{i}.pdf')
    
            print('转换完毕')

    当我们运行文件时传递url、headers和图片保存路径,调用类。headers在这里改,把H.Header(),改成你的user-agent

    if __name__ == '__main__':
    
        filename = './ppt'
    
        if not os.path.exists(filename):
    
            os.makedirs(filename)
    
        q = input('请输入要下载的url:')
    
        headers = {
            'user-agent': H.Header()
        }
    
    
    
        main(q,headers)

最终代码

# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   Description :
   FileName:      爬ppt.py
   Author :       MagICian(27822)
   QQ-email:      2782226338@qq.com
   ShanHai:       https://www.shserve.cn/author/400
-------------------------------------------------
   Creation Time:
                   2023年04月08日10点33分31秒
-------------------------------------------------
"""
import requests
import os
from PyPDF2 import PdfMerger
from Identity.Information import H
from PIL import Image
from bs4 import BeautifulSoup


class main():

    def __init__(self,url,heades):

        self.url = url

        self.header = heades

        self.getImg()

        self.merge_pdf()


    def getImg(self):

        htmldata = requests.get(url=self.url,headers=self.header)

        htmldata.encoding = 'utf-8'

        html = BeautifulSoup(htmldata.text,'lxml')

        imgData = html.select('div[class="swiper-wrapper"] div  img')

        urldata = []

        for imgurl in imgData:

            imgurl = imgurl.get('src')

            if imgurl not in urldata:

                urldata.append(imgurl)

        for it,url in enumerate(urldata):

            imgcontent = requests.get(url=url,headers=self.header).content

            loadfile = f'{filename}/{it+1}.png'

            with open(f'{filename}/{it+1}.png','wb') as f:

                f.write(imgcontent)



            self.convert_to_pdf(loadfile,it)


            print('正在下载第{}张图片'.format(it+1))
        print('共{}张图片,下载完毕'.format(len(urldata)))


    def convert_to_pdf(self,path,name):

        img_path = path

        pdf_path = f'{filename}/{name+1}.pdf'

        img = Image.open(img_path)

        img.save(pdf_path, "PDF", resolution=100.0)

        os.remove(img_path)

        print('正在转换第{}张图片'.format(name+1))

    def merge_pdf(self):

        merger = PdfMerger()

        n = 0

        for i in range(1, len(os.listdir(filename))):

            merger.append(f'{filename}/{i}.pdf')

            n += 1

        merger.write(f'{filename}/{n}.pdf')

        merger.close()

        for i in range(1, len(os.listdir(filename))):

            if i != n:

                os.remove(f'{filename}/{i}.pdf')

        print('转换完毕')











if __name__ == '__main__':

    filename = './ppt'

    if not os.path.exists(filename):

        os.makedirs(filename)

    q = input('请输入要下载的url:')

    headers = {
        'user-agent': H.Header()
    }



    main(q,headers)
© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容