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

嗨喽,大家好呀~这里是爱看美女的茜茜呐

环境使用:

  • Python 3.8

  • Pycharm

  • wkhtmltopdf 软件 -- 文末获取

模块使用:

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

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

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

  • pdfkit >>> pip install pdfkit

爬虫思路:

  1. 明确需求:

    明确采集网站以及数据内容是什么?

    抓包分析, 数据具体是请求那个链接可以得到

    1. F12 打开开发者工具

    2. 刷新网页

    3. 搜索内容

爬虫代码实现基本四大步骤:
  1. 发送请求 -> 模拟浏览器对于链接地址发送请求

    请求链接: https://zhuanlan.zhihu.com/p/193129156 get请求

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

    开发者工具: Response

  3. 解析数据 -> 提取我们需要的数据内容

    文章数据内容 <包含html格式>

  4. 保存数据 -> 数据内容保存本地文件

    I. 先保存html文件

    II. 把html文件转成PDF

代码展示

python 复制代码
'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
# 导入数据请求模块
import requests
# 导入数据解析模块
import parsel
# 导入正则表达式模块
import re
# 导入pdf
import pdfkit
"""
1. 发送请求 -> 模拟浏览器对于链接地址发送请求
    - 模拟浏览器: 防止被反爬
        headers 请求头 --> 在开发者工具中可以直接复制
    - 链接地址
    - 发送请求

<Response [200]> 响应对象, 表示请求成功
"""

模拟浏览器 字典数据类型, 构建完整键值对

python 复制代码
'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 )
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
headers = {
    # User-Agent 用户代理 表示浏览器基本身份信息
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
link = 'https://www.zhihu.com/api/v4/columns/c_1090924073042837504/items?limit=10&offset=10'
json_data = requests.get(url=link, headers=headers).json()
for index in json_data['data']:

链接地址

python 复制代码
    url = f'https://zhuanlan.zhihu.com/p/{index["id"]}'

发送请求 --> post请求data <隐藏> params请求参数<在链接问号后面>

python 复制代码
    response = requests.get(url, headers=headers)
"""
2. 获取数据 -> 获取服务器返回响应数据
    response.text 获取响应文本数据
        网页源代码 html 
    response.json() 获取响应json数据
        必须完整json数据格式
    response.content 获取响应二进制数据
        获取图片/视频/音频/特定格式文件
        
3. 解析数据 -> 提取我们需要的数据内容
    文章数据内容 <包含html格式>

解析方式:
    re 正则表达式 --> 对于字符串数据进行提取
    css选择器 --> 根据标签属性提取数据内容
    xpath节点提取 --> 根据标签节点提取数据内容


个人喜好: css选择器 -> 根据标签属性提取数据内容        
"""
python 复制代码
    selector = parsel.Selector(response.text)

提取整个文章数据 html

python 复制代码
    content = selector.css('.css-376mun').get()
"""
1. 提取图片链接
2. 提取需要被替换的内容
3. 一一替换
"""

提取图片

python 复制代码
    img_url_list = re.findall('<noscript><img src="(.*?)" data-caption=""', content)

提取需要被替换的内容

python 复制代码
'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 )
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
    img_list = re.findall('</noscript><img src="(.*?)" data-caption=""', content)

for循环遍历, 同时遍历两个列表数据

python 复制代码
    for img_url, img in zip(img_url_list, img_list):

replace 字符串替换

python 复制代码
        content = content.replace(img, img_url)

提取文章标题

python 复制代码
    title = selector.css('.Post-Main .Post-Title::text').get()
    title = re.sub(r'[\\\/\''\':*?"<>|]', '', title)
    print(title)
"""
4. 保存数据 -> 数据内容保存本地文件
    I.  先保存html文件
    II. 把html文件转成PDF
"""
python 复制代码
    html_str ='''
    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
    {article}
    </body>
    </html>
    '''

字符串格式化方法

python 复制代码
    html = html_str.format(article=content)

文件路径

python 复制代码
    HtmlPath = f'html\\{title}.html'
    with open(HtmlPath, mode='w', encoding='utf-8') as f:

写入数据

python 复制代码
        f.write(html)

    PdfPath = f'pdf\\{title}.pdf'

wkhtmltopdf 添加软件路径

python 复制代码
    config = pdfkit.configuration(wkhtmltopdf=r'D:\demo\wkhtmltopdf\bin\wkhtmltopdf.exe')
    pdfkit.from_file(HtmlPath, PdfPath, configuration=config)

尾语

感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

相关推荐
流浪的小新1 分钟前
【AI】人工智能、LLM学习资源汇总
人工智能·学习
A懿轩A1 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神1 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
半盏茶香1 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
LostSpeed1 小时前
在福昕(pdf)阅读器中导航到上次阅读页面的方法
pdf
旭久1 小时前
SpringBoot的Thymeleaf做一个可自定义合并td的pdf表格
pdf·html·springboot
Evand J2 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB2 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
Ronin3052 小时前
11.vector的介绍及模拟实现
开发语言·c++
计算机学长大白3 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言