抓取网页生成电子书(如何将网页上显示的内容导出为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操作请看:

  从此,结束了~~~

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线