Python采集某乎专栏文章保存成pdf

news2024/11/16 4:16:23

前言

大家早好、午好、晚好吖 ❤ ~

环境使用:

  • Python 3.8

  • Pycharm

  • wkhtmltopdf 软件 --> 文章下方名片信领取

模块使用:

  • requests >>> pip install requests 数据请求

  • parsel >>> pip install parsel 数据解析

  • re >>> 内置模块 不需要安装 正则表达式

  • pdfkit >>> pip install pdfkit

代码实现步骤

  1. 发送请求, 模拟浏览器对于url地址发送请求

  2. 获取数据, 获取服务器返回响应数据

    开发者工具: response <网页源代码>

  3. 解析数据, 提取我们想要的数据内容

    • 文章标题

    • 文章内容

  4. 保存数据, 先保存html文件, 然后把html文件转成pdf

代码展示

模块导入

# 导入数据请求模块 --> 第三方模块, 需要安装 pip install requests
import requests
# 导入数据解析模块 --> 第三方模块, 需要安装 pip install parsel
import parsel
# 导入正则表达式模块 --> 内置模块, 不需要安装
import re
# 导入pdf模块 --> 第三方模块, 需要安装 pip install pdfkit
import pdfkit

“”"

1. 发送请求, 模拟浏览器对于url地址发送请求

  • 模拟浏览器: 把python代码伪装成浏览器去发送请求

    目的: 为了防止被反爬 一种简单反反爬手段

    反爬: 得不到数据或者得到的数据不是你想要的

    headers请求头伪装: 可以直接复制

    字典数据类型, 要构建完成键值对

    状态码:

    404 链接不对

200 请求成功

  • <Response [200]>: 响应对象

    Response --> 中文: 响应的意思

    <> --> 表示对象

    对于url地址发送请求, 请求成功了

多个文章采集: 分析请求链接变化规律

主要改变的是: 文章ID 怎么找 通过抓包

爬虫采集数据 --> requests 请求获取服务器返回响应数据, 而不是元素面板

“”"
PS:完整源码如有需要的小伙伴可以加下方的群去找管理员免费领取

请求链接

link = 'https://www.*****.com/api/v4/columns/c_1557808437160980480/items?limit=10&offset=20'

模拟伪装

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}

发送请求

json_data = requests.get(url=link, headers=headers).json()
for index in json_data['data']:
    # 请求链接
    url = f'https://zhuanlan.****.com/p/{index["id"]}'
    # 模拟伪装
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
    }
    # 发送请求 --> 为什么是用get请求
    response = requests.get(url=url, headers=headers)

“”"

2. 获取数据, 获取服务器返回响应数据

开发者工具: response <网页源代码>

response.text --> 获取响应文本数据 <html字符串数据>

3. 解析数据, 提取我们想要的数据内容

  • 文章标题

  • 文章内容

解析方法: 选择哪一种解析方法, 根据返回的数据来决定

css选择器 —> 根据标签属性提取内容

xpath节点 —> 根据标签节点提取内容

re —> 对于字符串数据进行提取

json字典取值 —> 返回json字典数据

本次使用css选择器 --> 找到相应数据标签, 然后复制语法即可

如果说, 你要完整学会掌握css语法, 在咱们系统课程里面都要学2.5个小时左右

“”"

    # 把获取下来html字符串数据<response.text>, 转成可解析对象
    selector = parsel.Selector(response.text)
    # 提取标题
    title = selector.css('.Post-Main .Post-Title::text').get()
    # 提取文章内容 <html格式>
    content = selector.css('.css-376mun .css-1g0fqss').get()
    """
    # 需要提取图片链接, 然后把后面内容 src="data:image/svg+xml;utf8,&lt;svg%20....'&gt;&lt;/svg&gt;" 替换成图片链接
    正则表达式的简单使用:
        re模块findall方法 --> 找到所有我们想要的数据内容
        re.findall('什么数据', '什么地方')  ---> 从什么地方, 去找什么样的数据内容
    
    """
    # 提取图片链接
    img_url_list = re.findall('<noscript><img src="(.*?)" data-caption=""', content)
    # 提取需要替换的内容
    img_list = re.findall('</noscript><img src="(.*?)" data-caption=""', content)
    # for循环遍历, 把元素一个一个提取出来
    for img_url, img in zip(img_url_list, img_list):
        content = content.replace(img, img_url)
    # 前端代码模版
    html_str ='''
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
    {article}
    </body>
    </html>
    '''
    # 字符串格式化方法 ---> 把content内容, 传入到html_str把这部分{article}内容替换掉
    html = html_str.format(article=content)

“”"

4. 保存数据

“”"

    # 'html\\'<文件夹> + title<文件名> + '.html'<文件格式>
    html_path = 'html\\' + title + '.html'
    # pdf路径
    pdf_path = 'pdf\\' + title + '.pdf'
    with open(html_path, mode='w', encoding='utf-8') as f:
        f.write(html)
    print(title)
    # 把html文件, 转成pdf文件, 配置软件
    config = pdfkit.configuration(wkhtmltopdf=r'D:\demo\wkhtmltopdf\bin\wkhtmltopdf.exe')
    pdfkit.from_file(html_path, pdf_path, configuration=config)

尾语 💝

好了,今天的分享就差不多到这里了!

完整代码、更多资源、疑惑解答直接点击下方名片自取即可。

有更多建议或问题可以评论区或私信我哦!一起加油努力叭(ง •_•)ง

喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

域内委派攻击

域委派是指&#xff0c;将域内用户的权限委派给服务账号&#xff0c;使得服务账号能以用户权限开展域内活动。利用委派可获取域管理员权限 域委派主要分为三种&#xff1a; 非约束性委派 约束性委派 基于资源的约束性委派 在Windows系统中&#xff0c;只有服务账号和主机账号…

操作系统权限提升(五)之系统错误配置-PATH环境变量提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 注&#xff1a;阅读本编文章前&#xff0c;请先阅读系列文章…

寻找整数

问题描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 有一个不超过 10^{17}1017 的正整数 nn,知道这个数除以 2 至 49 后的余数如下表所示,求这个正整数最小是多少。 运行限制 最大运行时间:1s最大运行内存: 512M参考答案 mp = {2: 1, …

虹科动态 | 虹科HSR/PRP IP核现已支持HSR/PRP最新标准

HSR与PRP是专注于解决高可靠性自动化网络传输的技术&#xff0c;其所属的国际标准为IEC 62439。最初&#xff0c;IEC发布此项标准主要目的是为了满足IEC 61850-5中所提到的变电站自动化应用中各通信组件或服务故障所要求的恢复时间问题&#xff0c;但协议设计时的通用性&#x…

PTA L1-017 到底有多二

前言&#xff1a;本期是关于到底有多二的详解&#xff0c;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读&#xff0c;今天你c了吗&#xff1f; 题目&#xff1a; 一个整数“犯二的程度”定义为该数字中包含2的个数与其位数…

Java多线程:Future和FutureTask

一、Future Future是一个接口&#xff0c;所有方法如下&#xff1a; 上源码&#xff1a; package java.util.concurrent; public interface Future<V> {boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws Interru…

5.3 场效应管的高频等效模型

由于场效应管各级之间存在极间电容&#xff0c;因而其高频响应与晶体管相似。根据场效应管的结构&#xff0c;可得出图5.3.1(a)所示的高频等效模型&#xff0c;大多数场效应管的参数如表1所示。由于一般情况下 rgsr_{gs}rgs​ 和 rdsr_{ds}rds​ 比外接电阻大得多&#xff0c;因…

Lesson 4.5 梯度下降优化基础:数据归一化与学习率调度

文章目录一、数据归一化方法1. 数据归一化计算公式1.1 0-1 标准化1.2 Z-Score 标准化1.3 非线性标准化2. 数据归一化算法执行过程3. 数据归一化算法评价4. Z-Score 标准化算法评价及横向对比二、梯度下降算法优化初阶1. 数据归一化与梯度下降算法优化2. 学习率调度3. 小批量梯度…

RV1126笔记二十六:lvgl移植

若该文为原创文章,转载请注明原文出处。 之前做项目的时候有了解到LVGL这个开源的gui库,有QT仿真过智能家居控制界面,也在STM32上移植过。 趁着过年期间就想着把它移植到自己的开发板上看看能不能正常跑起来。虽说不难,但也花了一些功夫,因此也在这里做下总结。 下载地址…

STC15系列PWM中断控制寄存器介绍以及PWM相关示例

STC15系列PWM中断控制寄存器介绍以及PWM呼吸灯代码实现&#x1f4cc;相关篇《STC15系列PWM功能相关功能寄存器介绍》✨以下数据来源于stc15手册。 &#x1f4d3;增强型PWM波形发生器的中断控制 1.PWM中断优先级控制寄存器:IP2 PPWMFD:PWM异常检测中断优先级控制位。 当PPWMFD…

微信小程序员010宠物交易系统商城系统

宠物交易系统商城系统分为用户小程序端和管理员后台网页端&#xff0c;其中后端是采用java编程语言&#xff0c;mysql数据库&#xff0c;idea开发工具&#xff0c;ssm框架开发&#xff0c;本系统分为用户和管理员两个端&#xff0c;其中用户可以在小程序端进行注册登陆&#xf…

嵌入式Linux从入门到精通之第十节:系统编程之进程

进程的定义 程序:程序是存放在存储介质上的一个可执行文件。进程:进程是程序的执行实例,包括程序计数器、寄存器和变量的当前值。程序是静态的,进程是动态的: 程序是一些指令的有序集合,而进程是程序执行的过程。进程的状态是变化的,其包括进程的创建、调度和消亡。 在…

【微服务】分布式搜索引擎elasticsearch(1)

分布式搜索引擎elasticsearch&#xff08;1&#xff09;1.elasticsearch1.1.了解ES1.1.1.elasticsearch的作用1.1.2.ELK技术栈1.1.3.elasticsearch和lucene1.1.4.为什么不是其他搜索技术&#xff1f;1.1.5.总结1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引1.2.3.正向和倒排1.3.es…

08-linux网络管理-nc命令(TCP|UDP网络联通测试,文件传输,带宽测试)

文章目录1. 安装2. 选项2.1 帮助命令2.2 常用示例- 监听TCP端口&#xff08;默认&#xff09;- 监听UDP端口- 链接TCP端口- 链接UDP端口- 接收数据重定向- 上传数据3. 完整示例3.1 示例1&#xff08;端口联通检查&#xff09;3.2 示例2&#xff08;文件传输&#xff09;3.3 带宽…

Linux权限的基本知识

本文已收录至《Linux知识与编程》专栏&#xff01;作者&#xff1a;ARMCSKGT演示环境&#xff1a;CentOS 7 目录 前言 正文 权限是什么&#xff1f; Linux权限的划分 Linux用户的切换命令 Linux文件权限 Linux文件类型 Linux文件权限 Linux角色划分 文件权限的访问和…

buu [MRCTF2020]keyboard 1

题目描述&#xff1a; 题目分析&#xff1a; 由标题keyboard可知与键盘有关 看到一串数字有重复的&#xff0c;且重复数在1~4之间&#xff0c;符合九键拼音键盘 个数便对应位数 例如&#xff1a;6对应m , 666对应o 所以以上对应下来是 “mobilephond” 试过之后不对&#…

Unity-Tcp-网络聊天功能(一): 基本功能

Protobuff的效率较高。TCP用于延迟不高的游戏效果较好&#xff0c;UDP对开发人员友好&#xff08;对于消息的重发等&#xff0c;降低网络延迟&#xff09;&#xff0c;Websocket在网页端H5端进行通信&#xff0c;1.TCP相关API介绍与服务端编写TCP是面向连接的。因此需要创建监听…

【JavaEE多线程】synchronized原理篇

目录 一、synchronized的优化机制 1)无锁状态 2)偏向锁状态:非必要&#xff0c;不加锁 3)轻量级锁 4)重量级锁&#xff1a;挂起等待 二、锁消除 三、锁粗化 锁的粒度 锁粗化的好处 在这一篇文章当中&#xff0c;我们也提到了synchronized的作用。 Java对于synchroniz…

Python super()函数:调用父类的构造方法

Python 中子类会继承父类所有的类属性和类方法。严格来说&#xff0c;类的构造方法其实就是实例方法&#xff0c;因此毫无疑问&#xff0c;父类的构造方法&#xff0c;子类同样会继承。但我们知道&#xff0c;Python 是一门支持多继承的面向对象编程语言&#xff0c;如果子类继…

『Nonebot 插件编写教程』nonebot2处理消息的完整过程

文章目录前言捕获消息处理消息Bot机器人参数Event事件参数回复消息字符串与Message调用MessageSegment接口前言 前面已经有不止一篇博客教大家如何搭建nonebot2环境了大家可以去专栏查看&#xff0c;这篇博客并不会再次带大家来搭建nonebot2环境&#xff0c;而是着手与插件的编…