网站
简介
同第一ppt,这个网站大部分ppt资源免费。部分资源付费。我试着爬的时候发现它不像某些网站只放部分ppt图片,而是把所有ppt图片都放到网站源代码里。这对于爬虫爱好者来说非常友好,我们不用分析就能获取到我们想要的数据。代码有不了解的地方可以私信或者在评论区里问哦
思路
会员的ppt文件我们自然爬取不到,但是我们可以把爬取到的ppt文件照片转换成pdf文件,再把多张pdf文件合并成一张pdf文件,之后把合并后的pdf文件转换成ppt文件,这个代码已经实现了把爬取到的图片转pdf文件并且合并成一张pdf文件了,至于为什么不一步到位是由于小编也是python初学者,能力有限
使用
运行代码,输入要爬取的上面网站的会员链接
实现过程
助力工具:chatgpt、GitHub Copilot
- 先导入模块;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
- 创建一个叫main的类(看这篇文章写的可以不用创建),传入url和headers,用__init__函数实例化url和user-agent,,后面一些代码要调用它
class main(): def __init__(self,url,heades): self.url = url self.header = heades
- 在类main()里面创建一个获取url源代码的函数,我的命名是getImg,也就是
def gteImg(self):
。调用url,并且获取到url的源代码,用bs4模块中的BeautifulSoup模块解析url源代码的内容获取到照片链接。问:怎么知道照片的连接在哪里呢?答:简单,在这个网站的会员素材网页上按快捷键‘f12
’或者在页面上右键,点击‘检查
’之后看到以下这个界面,在面板里找到‘
元素
’,点击元素
面板里左上角,之后点击图片的位置即可看到图片的链接问:怎么知道它有没有在源代码里呢?如第一张图,右键点击
查看源代码
,在检查
的上方,之后搜索url链接关键字,如上图的url,我们在源代码界面按键盘快捷键ctrl+f
,粘贴url关键字,发现它是有数据的,就说明url链接在源代码里用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)
暂无评论内容