爬虫 Python将网页内容保存为PDF(url转pdf) 譬如下载某个专栏下的全部文章

我看到一个不错的教程,想下载教程下全部文章到本地,有时间看看,但是问了作者没有电子档,就想办法了。
PS: 我一天天的到底在干嘛!唉…


需求: 爬取一个网页里全部文章且存为pdf

参考链接:
【已解决】Python将网页内容保存为PDF (url转pdf)
Python正则表达式详解 (超详细,看完必会!)
爬虫:Python下载html保存成pdf——以下载知乎下某个专栏下所有文章为例
python爬虫,用正则表达式提取页面里所有的http链接

环境
windows 10
vscode
conda,python 3.8
步骤
1)先安装pdfkit:

conda install pdfkit
# 或者
pip install pdfkit

2)然后还要安装:wkhtmltopdf
去官网:https://wkhtmltopdf.org/
下载exe,安装到windows上就行。

但是呢,还要配置一下环境变量,把wkhtmltopdf安装目录下的bin文件夹的绝对路径配置到环境变量中。然后打开cmd,输入:echo %PATH%,让环境变量立马生效。

如果这时候开了vscode,还需要重启一下vscode(这应该是让环境变量在vscode的terminal/环境下生效)(我是关了重开,貌似也可以reload window)

3)在vscode下写如下代码:

import pdfkit
import os, sys
cur_file_dir = os.path.abspath(__file__).rsplit("\\", 1)[0]
# 你自己填入url
url = "https://xxx"
output_path = os.path.join(cur_file_dir, 'csdn.pdf')
pdfkit.from_url(url, output_path)

运行,然后就可以顺利打印啦!

亲测,单个网页这么转成pdf特别方便,和谷歌浏览器 打印再另存为pdf的结果一致。好用的不行。

怎么将一个网页下面全部的文章下载下来存pdf格式呢?以C++自学精简实践 目录(必读) 为例。

# -*- coding: utf-8 -*-            
import requests
import re
import os
import json
import pdfkit
from collections import deque

HEADERS={
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36',
        # 这里还可以以字典形式给出别的请求头属性
}
# 如果配置了环境变量无法立即生效(大概是需要重启),可以通过这一行语句添加环境变量
os.environ["PATH"] += os.pathsep + r'D:\wkhtmltox\bin'


def getUrls(zhuanlan):
    '''
    :param zhuanlan: such as https://zhuanlan.zhihu.com/reinforcementlearning   传入的是最后这个reinforcementlearning
    :return: 返回专栏下所有文章的url
    '''
    urls = []
    # p_titles = []
    offset = 0
    while True:
        url = 'https://zhuanlan.zhihu.com/api/columns/{}/articles?include=data&limit=100&offset={}'.format(zhuanlan, offset)
        html_string = requests.get(url,headers=HEADERS).text
        content = json.loads(html_string)   # 获取的content可以加载为json格式
        urls.extend([item['url'] for item in content['data']])  # 就可以用json的方式索引到所有的url
        # p_titles.extend([item['title'] for item in content['data']])  # 获取标题
        if len(content['data']) < 100:  # 如果是最后一页
            break
        else:
            offset += 100
    return urls


def getUrls2(zhuanlan):
    '''
    :param zhuanlan: such as https://zhuanlan.zhihu.com/reinforcementlearning   传入的是最后这个reinforcementlearning
    :return: 返回专栏下所有文章的url
    '''
    urlindex = 'https://zhuanlan.zhihu.com/{}'.format(zhuanlan)
    print('urlindex:', urlindex)
    resindex = requests.get(urlindex, headers=HEADERS)
    # print('resindex.text:', resindex.text)
    matchac = re.search(r'"articlesCount":(\d+),', resindex.text)   # 通过正则表达式获取文章总数
    articlesCount = int(matchac.group(1))
    upper = articlesCount//100+1  # 下面设置了每页显示100条,这里求总页数
    urls = []
    for i in range(upper):
        urlpage = 'https://zhuanlan.zhihu.com/api/columns/{}/articles?include=data&limit={}&offset={}'.format(zhuanlan, 100, 100*i)
        # limit最大是100
        respage = requests.get(urlpage, headers=HEADERS)
        respage.encoding = 'unicode_escape'
        matchurl = re.findall(r'"title":\s"[^"]+?",\s"url":\s"([^"]+?)",', respage.text)    # 通过正则匹配url
        if len(matchurl) !=0:
            urls += matchurl
        else:
            html_string = requests.get(urlpage, headers=HEADERS).text
            content = json.loads(html_string)  # 获取的content可以加载为json格式
            urls.extend([item['url'] for item in content['data']])  # 就可以用json的方式索引到所有的url
            return urls


def get_html(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36',
    }
    res = requests.get(url, headers=headers)
    return res.text


def extract_all_urls(html):
    pattren = re.compile(r'https://zhuanlan.zhihu.com/p/\d+')
    # pattren = re.compile(r'https://www.lz13.cn/[^\s]+.html')
    url_lst = pattren.findall(html)
    return url_lst


def get_urls_from_url(url):
    html = get_html(url)
    url_lst = extract_all_urls(html)
    return url_lst


def get_all_urls(web_site):
    url_access_set = set()  # 已经访问过的url
    queue_url_set = set()
    url_lst = get_urls_from_url(web_site)
    url_access_set.add(web_site)

    queue = deque()
    for url in url_lst:
        queue.append(url)
        queue_url_set.add(url)

    # while len(queue) != 0:
    #     print(len(queue))
    #     url = queue.popleft()
    #     if url in url_access_set:
    #         continue
    #
    #     url_access_set.add(url)
    #     url_lst = get_urls_from_url(url)

        # for url in url_lst:
        #     if url not in queue_url_set:
        #         queue.append(url)
        #         queue_url_set.add(url)

    return list(queue_url_set)


def saveArticlesPdf(urls, target_path):
    os.makedirs(target_path, exist_ok=True)
    for i, url in enumerate(urls):
        print('[ {} / {} ] processing'.format(str(i+1).zfill(3), len(urls)))
        content = requests.get(url, headers=HEADERS).text
        # print('content:', content)
        try:
            title = re.search(r'<h1\sclass="Post-Title">(.+)</h1>', content).group(1)
        except Exception as e:
            print('error content:', content)
        content = content.replace('<noscript>', '')     # 解决无法下载图片问题,其中图片路径为相对路径
        content = content.replace('</noscript>', '')

        rstr = r"[\/\\\:\*\?\"\<\>\|]"  # '/ \ : * ? " < > |'
        title = re.sub(rstr, " ", title)
        title = re.sub('​', ' ', title)
        print('title:', title)
        try:
            # 方式一,直接调用wkhtmltopdf的命令
            # os.system('wkhtmltopdf {} {}'.format(content, target_path+'/{}.pdf'.format(title)))

            # 方式二,调用pdfkit包的方式
            pdfkit.from_string(content, target_path+'/{}.pdf'.format(title))
        except ValueError as e:
            print(title, e)


if __name__ == '__main__':
    zhuanlan = 'reinforcementlearning'
    # urls = getUrls(zhuanlan)
    # urls = getUrls2(zhuanlan)

    urls = get_all_urls('https://zhuanlan.zhihu.com/p/657345052')
    saveArticlesPdf(urls, r'E:\save\{}'.format(zhuanlan))

结果展示:

复制上面的代码一定能复现成功这个结果!

说明:
代码没有整理,能用我就没管了!我没打算往爬虫方向走,所以代码写的很粗糙,也没有理解很深刻,草草搞的东西,有问题可以讨论但是我大概率不懂哈!

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用Python爬虫网页内容保存PDF文件非常简单。下面是一种常见的实现方式: 首先,我们需要安装所需的Python库。我们可以使用pip来安装pdfkit和wkhtmltopdf库。可以使用以下命令来安装它们: pip install pdfkit pip install wkhtmltopdf 安装完成后,我们可以在Python脚本中导入pdfkit库,并使用其from_url方法将网页内容保存PDF文件。例如,下面是一个简单的示例: import pdfkit def save_as_pdf(url, file_path): try: pdfkit.from_url(url, file_path) print("成功将网页保存PDF文件!") except Exception as e: print("保存PDF文件时出错:", e) save_as_pdf("https://example.com", "example.pdf") 在这个例子中,我们定义了一个名为save_as_pdf的函数,它接受两个参数:url表示要爬取的网页URL,file_path表示PDF文件的保存路径。函数内部使用pdfkit.from_url方法将网页内容保存PDF文件。 你可以将上述代码保存为一个Python脚本文件,然后运行它。在运行时,确保将https://example.com替换为你要爬取的网页URL,将example.pdf替换为要保存PDF文件的路径和名称。 这是一个简单的示例,你可以根据需要调整和扩展它。还可以使用pdfkit的其他方法来处理更复杂的PDF生成需求。 ### 回答2: 要将python爬虫保存PDF,可以使用第三方库如pdfkit和wkhtmltopdf。以下是保存过程的基本步骤: 1. 首先,确保已经安装了wkhtmltopdf,它是一个开源的命令行工具,用于将HTML文件换为PDF格式。 2. 在python中安装和导入pdfkit库,它是一个封装了wkhtmltopdf的库,可通过python调用相应命令实现换。 3. 接下来,利用pdfkit.from_url()或pdfkit.from_file()方法,将要保存PDF网页URL或本地HTML文件路径作为参数传入。 4. 创建一个输出目标PDF文件的路径,可通过pdfkit配置项设置输出路径和文件名。 5. 调用pdfkit函数将网页或HTML换为PDF,并将其保存到指定路径。 6. 最后,可添加错误处理和适当的提示信息,确保程序的稳定性和用户友好性。 例如,以下是一个简单的示例代码: ```python import pdfkit # 网页URL url = 'https://example.com' # 输出PDF文件路径 output_path = 'output.pdf' # 配置选项,设置输出路径和文件名 options = { 'page-size': 'A4', 'margin-top': '0mm', 'margin-right': '0mm', 'margin-bottom': '0mm', 'margin-left': '0mm', 'encoding': 'UTF-8', 'no-outline': None } try: # 将网页换为PDF保存到输出路径 pdfkit.from_url(url, output_path, options=options) print('保存成功!') except Exception as e: print('保存失败:', str(e)) ``` 以上就是使用python爬虫保存PDF的基本步骤和示例代码。可以根据实际需求定制更复杂的功能,如添加页眉页脚、自定义页面布局等。 ### 回答3: 使用Python爬虫保存PDF可以采用以下步骤: 1. 首先,你需要使用Python爬虫库(例如beautifulsoup、urllib、selenium等)来获取你想要保存PDF网页内容。通过这些库,可以实现网页的请求、解析和内容提取。 2. 接下来,你需要使用PythonPDF处理库(例如pyfpdf、reportlab、fpdf等)来创建一个PDF文件对象。这些库提供了创建和编辑PDF文件的功能,你可以设置PDF的页面大小、边距、字体、颜色等。 3. 将获取到的网页内容添加到PDF文件中,可以使用PDF处理库提供的方法,如add_page()、set_font()、cell()等来添加标题、段落、图片以及表格等内容。 4. 当你将需要的内容添加到PDF文件中后,你可以保存这个PDF文件到本地目录。使用PDF处理库提供的save()或output()方法可以将PDF保存在指定的路径下。 需要注意的是,保存PDF的前提是你需要确保你有权限爬取和保存相关内容,以及了解相关的法律法规。此外,还可以根据具体需求进行一些个性化的设置和处理,比如添加页眉页脚、分页、设置PDF的样式等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值