抓取网页生成电子书(如何将网页上显示的内容导出为pdf文件?)
优采云 发布时间: 2021-10-06 20:01抓取网页生成电子书(如何将网页上显示的内容导出为pdf文件?)
我们都知道一个普通的网页是由html+css+js组成的,它的本质是由一段代码编译而成的。图片是由一堆二进制数据组成的,我们如何将网页显示的内容导出为我们想要的图片或者pdf呢?博主很无聊,在github上闲逛,发现了一个有趣的库pyppeteer,满足了我需要的导出需求。接下来,我们来看看它是如何运作的:
安装所需的库
pip install pillow
pip install reportlab
pip install pyppeteer
导出为图片
import os
import asyncio
from pyppeteer import launch
async def save_image(url, img_path):
"""
导出图片
:param url: 在线网页的url
:param img_path: 图片存放位置
:return:
"""
browser = await launch()
page = await browser.newPage()
# 加载指定的网页url
await page.goto(url)
# 设置网页显示尺寸
await page.setViewport({'width': 1920, 'height': 1080})
'''
path: 图片存放位置
clip: 位置与图片尺寸信息
x: 网页截图的x坐标
y: 网页截图的y坐标
width: 图片宽度
height: 图片高度
'''
await page.screenshot({'path': img_path, 'clip': {'x': 457, 'y': 70, 'width': 730, 'height': 2600}})
await browser.close()
if __name__ == '__main__':
url = "https://www.jianshu.com/p/13dad*敏*感*词*63f40"
img_path = os.path.join(os.getcwd(), "example.png")
loop = asyncio.get_event_loop()
loop.run_until_complete(save_image(url, img_path))
执行完成后,不出意外的话,在当前目录下会生成一个名为example.png的文件,就是我们导出的图片文件!
将整个页面导出为pdf
import os
import asyncio
from pyppeteer import launch
async def save_pdf(url, pdf_path):
"""
导出pdf
:param url: 在线网页的url
:param pdf_path: pdf存放位置
:return:
"""
browser = await launch()
page = await browser.newPage()
# 加载指定的网页url
await page.goto(url)
# 设置网页显示尺寸
await page.setViewport({'width': 1920, 'height': 1080})
'''
path: 图片存放位置
width: 纸张宽度,带单位的字符串
height: 纸张高度,带单位的字符串
'''
await page.pdf({'path': pdf_path, 'width': '730px', 'height': '2600px'})
await browser.close()
if __name__ == '__main__':
url = "https://www.jianshu.com/p/13dad*敏*感*词*63f40"
pdf_path = os.path.join(os.getcwd(), "example.pdf")
loop = asyncio.get_event_loop()
loop.run_until_complete(save_pdf(url, pdf_path))
执行完成后,不出意外的话,在当前目录下会生成一个名为example.pdf的文件,就是我们导出的pdf文件!但是,这种出口有一个缺点。它将整个网页导出为 pdf。不支持图片等位置参数。可以截取部分区域进行导出!因此,我稍微修改了代码,请参阅下面的“将区域导出为pdf”!
将区域导出为 pdf
import os
import asyncio
from io import BytesIO
from PIL import Image
from pyppeteer import launch
from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.utils import ImageReader
async def save_pdf(url, pdf_path):
"""
导出pdf
:param url: 在线网页的url
:param pdf_path: pdf存放位置
:return:
"""
browser = await launch()
page = await browser.newPage()
# 加载指定的网页url
await page.goto(url)
# 设置网页显示尺寸
await page.setViewport({'width': 1920, 'height': 1080})
'''
clip: 位置与图片尺寸信息
x: 网页截图的x坐标
y: 网页截图的y坐标
width: 图片宽度
height: 图片高度
'''
img_data = await page.screenshot({'clip': {'x': 457, 'y': 70, 'width': 730, 'height': 2600}})
im = Image.open(BytesIO(img_data))
page_width, page_height = im.size
c = Canvas(pdf_path, pagesize=(page_width, page_height))
c.drawImage(ImageReader(im), 0, 0)
c.save()
if __name__ == '__main__':
url = "https://www.jianshu.com/p/13dad*敏*感*词*63f40"
pdf_path = os.path.join(os.getcwd(), "example.pdf")
loop = asyncio.get_event_loop()
loop.run_until_complete(save_pdf(url, pdf_path))
这样我们就可以进行区域截取,导出pdf文件了!
值得注意的是,由于网络、配置以及各种不可控因素,上述方法都会有一定程度的导出错误,所以建议添加重试机制!
更多pyppeteer操作请看:
从此,结束了~~~