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

ops/2024/9/20 3:54:01/ 标签: 爬虫, python, pdf

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


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

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

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

python">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下写如下代码:

python">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++自学精简实践 目录(必读) 为例。

python"># -*- coding: utf-8 -*-            
import requests
import re
import os
import json
import pdfkit
from collections import dequeHEADERS={'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 = 0while True:url = 'https://zhuanlan.zhihu.com/api/columns/{}/articles?include=data&limit=100&offset={}'.format(zhuanlan, offset)html_string = requests.get(url,headers=HEADERS).textcontent = 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:  # 如果是最后一页breakelse:offset += 100return urlsdef 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最大是100respage = requests.get(urlpage, headers=HEADERS)respage.encoding = 'unicode_escape'matchurl = re.findall(r'"title":\s"[^"]+?",\s"url":\s"([^"]+?)",', respage.text)    # 通过正则匹配urlif len(matchurl) !=0:urls += matchurlelse:html_string = requests.get(urlpage, headers=HEADERS).textcontent = json.loads(html_string)  # 获取的content可以加载为json格式urls.extend([item['url'] for item in content['data']])  # 就可以用json的方式索引到所有的urlreturn urlsdef 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.textdef 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_lstdef get_urls_from_url(url):html = get_html(url)url_lst = extract_all_urls(html)return url_lstdef get_all_urls(web_site):url_access_set = set()  # 已经访问过的urlqueue_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))

结果展示:

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

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


http://www.ppmy.cn/ops/40826.html

相关文章

JS_监听dom变化触发,new MutationObserver

MutationObserver 是一个用于监测 DOM 变化的接口&#xff0c;它提供了一种机制来异步观察在特定元素或文档中发生的 DOM 变化。 MutationObserver 的作用包括&#xff1a; 1.监测 DOM 变化&#xff1a;你可以创建一个 MutationObserver 实例&#xff0c;并指定一个回调函数。…

【论文笔记】CNN2GNN: How to Bridge CNN with GNN

Abstract CNN在视觉任务上表现优异&#xff0c;通常堆叠大量卷积核来提高训练表现&#xff1b; GNN成功用几个图神经层探索了图数据之间的潜在拓扑关系。 由于缺乏图结构&#xff0c;在非图数据上无法使用GNN&#xff0c;在大规模场景下推理延迟较高。 提出问题&#xff1a;如…

blender 制作圆角立方体模型,倒角实现。cocos 使用。导出fbx

图片&#xff1a; 步骤&#xff1a; 1.首先创建一个立方体&#xff0c;这里可以使用默认的立方体。 2.在属性面板选择如“扳手”图标一样的修改器工具。 3.设置数量和段数实现圆角的圆滑效果&#xff0c;没有菱角。 保存导出相关的教程&#xff1a;

Linux防火墙iptalbes

1 iptalbes 1.1 概念 防火墙(Firewall)是一种隔离技术&#xff0c;用于安全管理与筛选的软件和硬件设备&#xff0c;使计算机内网和外网分开&#xff0c;可以防止外部网络用户以非法手段通过外部网络进入内部网络&#xff0c;保护内网免受外部非法用户的侵入。 1.2 SELinux …

景源畅信电商:经营抖店需要用电脑吗?

在数字时代的浪潮中&#xff0c;抖音小店(简称抖店)成为了众多创业者和品牌的新宠。它不仅提供了便捷的线上销售渠道&#xff0c;还通过短视频的形式拉近了卖家与买家的距离。对于这样一个新兴的电商平台&#xff0c;许多跃跃欲试的商家都关心同一个问题&#xff1a;经营抖店究…

虚拟机有线已连接但无法上网—·可能性之一

背景 VMware虚拟机&#xff0c;搭建了三台Linux服务器&#xff0c;组成Hadoop集群&#xff0c;由于在Hadoop102上有一些经常与Mysql数据库交互的任务&#xff0c;需要经常打开运行&#xff0c;而Hadoop103和104则经常处于关闭状态&#xff0c;一段时间后再次启动集群时候&…

如何进行并行执行的诊断与调优 —— 《OceanBase 并行执行》系列 6

在诊断并行执行问题时&#xff0c;我们可以从两个主要方面展开分析。首先&#xff0c;从整体系统层面进行考量&#xff0c;比如检查网络是否畅通、磁盘IO是否过载、CPU资源是否已用满&#xff1b;其次&#xff0c;针对具体的SQL语句进行深入剖析&#xff0c;定位问题SQL&#x…

【软考网络工程师】每日练题学知识

1.在EIGRP协议中&#xff0c;某个路由器收到了两条路径到达目标网络&#xff0c;路径1的带宽为100Mbps&#xff0c;延迟2ms&#xff0c;路径2的带宽为50Mbps&#xff0c;迟为4ms&#xff0c;如果EIGRP使用带宽和延迟的综合度量标准&#xff0c;那么该路由器选择的最佳路径是&am…

超级好用的C++实用库之日志类

&#x1f4a1; 需要该C实用库源码的大佬们&#xff0c;可搜索微信公众号“希望睿智”。添加关注后&#xff0c;输入消息“超级好用的C实用库”&#xff0c;即可获得源码的下载链接。 概述 日志类主要用于在程序运行过程中记录信息、错误、警告以及其他需要跟踪的数据&#xff0…

【专利】一种日志快速分析方法、设备、存储介质

公开号CN116560938A申请号CN202310311478.5申请日2023.03.28 是我在超音速人工智能科技股份有限公司(833753) 职务作品&#xff0c;第一发明人是董事长夫妇&#xff0c;第二发明人是我。 ** 注意** &#xff1a; 内容比较多&#xff0c;还有流程图、界面等。请到 专利指定页面…

清华团队开发首个AI医院小镇模拟系统;阿里云发布通义千问 2.5:超越GPT-4能力;Mistral AI估值飙升至60亿美元

&#x1f989; AI新闻 &#x1f680; 清华团队开发首个AI医院小镇模拟系统 摘要&#xff1a;来自清华的研究团队最近开发出了一种创新的模拟系统&#xff0c;名为"Agent Hospital"&#xff0c;该系统能够完全模拟医患看病的全流程&#xff0c;其中包括分诊、挂号、…

VC 编程开发中的 封装类 :log日志类 和SQL server 操作类 源代码

VC 编程开发中的 封装类 &#xff1a;日志类 和SQL server 操作类 源代码 在VC&#xff08;Visual C&#xff09;开发中&#xff0c;日志文件输出是一个至关重要的环节&#xff0c;它对于程序调试、问题排查以及系统监控等方面都具有不可替代的作用。以下是对日志文件输出在VC开…

【PB案例学习笔记】-01创建应用、窗口与控件

写在前面 这是PB案例学习笔记系列文章的第一篇&#xff0c;也是最基础的一篇。后续文章中【创建程序基本框架】部分操作都跟这篇文章一样&#xff0c; 将不再重复。该系列文章是针对具有一定PB基础的读者&#xff0c;通过一个个由浅入深的编程实战案例学习&#xff0c;提高编…

Vue的学习 —— <vue指令>

目录 前言 正文 内容渲染指令 内容渲染指令的使用方法 v-text v-html 属性绑定指令 双向数据绑定指令 事件绑定指令 条件渲染指令 循环列表渲染指令 侦听器 前言 在完成Vue开发环境的搭建后&#xff0c;若想将Vue应用于实际项目&#xff0c;首要任务是学习Vue的基…

Java入门基础学习笔记14——数据类型转换

类型转换&#xff1a; 1、存在某种类型的变量赋值给另一种类型的变量&#xff1b; 2、存在不同类型的数据一起运算。 自动类型转换&#xff1a; 类型范围小的变量&#xff0c;可以直接赋值给类型范围大的变量。 byte类型赋值给int类型&#xff0c;就是自动类型转换。 pack…

Hugging Muti Agent:第一章

Hugging Muti Agent系列文章目录 学习资料链接&#xff1a;Hugging Muti Agent&#xff08;二月学习&#xff09; 文章目录 Hugging Muti Agent系列文章目录第一章&#xff1a;前期准备1.1 获取MetaGPT1.2 配置MetaGPT1.2.1 调用 ChatGPT API 服务 1.3 首次尝试 第一章&#…

爬虫工作量由小到大的思维转变---<第七十四章 > Scrapy爬虫关闭方法(close)的机制及其在爬虫优化中的重要性

前言 Scrapy爬虫也有一个至关重要的功能——close方法&#xff0c;它控制着爬虫的“生命周期”。本论文旨在探讨Scrapy框架中close方法的核心作用和定义&#xff0c;以及它在爬虫管理与优化过程中的重要性。我们将深入探索如何通过这个强大的功能去优雅地结束一个爬取任务&…

【Unity】Unity项目转抖音小游戏(二)云数据库和云函数

业务需求&#xff0c;开始接触一下抖音小游戏相关的内容&#xff0c;开发过程中记录一下流程。 抖音云官方文档&#xff1a;https://developer.open-douyin.com/docs/resource/zh-CN/developer/tools/cloud/develop-guide/cloud-function-debug 1.开通抖音云环境 抖音云地址&a…

【springboot】整合oauth2.0和security,使用图形验证码和邮箱验证码登录

思路 当使用OAuth和Security框架(如Spring Security)进行登录,并且不使用密码而使用验证码时,生成Token的过程通常涉及以下几个步骤: 1.验证码生成与验证: 首先,系统会生成一个图形验证码并将其展示给用户。 用户输入他们看到的验证码。 系统验证用户输入的验证码是否…

docker的使用

docker的使用 1.首先&#xff0c;拉取一个镜像&#xff0c;如 docker pull 镜像名称 # 官方镜像 docker image pull 镜像名称 # 或简写为 docker pull 镜像名称 # 比如 docker pull ubuntu docker pull ubuntu:16.04# 个人镜像 docker pull 仓库名称/镜像名称 docker pull …