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

2023-12-13 03:34:05

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

环境使用:

  • Python 3.8

  • Pycharm

  • wkhtmltopdf 软件 – 文末获取

模块使用:

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

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

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

  • pdfkit >>> pip install pdfkit

爬虫思路:

  1. 明确需求:

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

    • 知乎专栏文章 https://zhuanlan.zhihu.com/p/193129156

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

    1. F12 打开开发者工具

    2. 刷新网页

    3. 搜索内容

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

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

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

    开发者工具: Response

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

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

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

    I. 先保存html文件

    II. 把html文件转成PDF

代码展示

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

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

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

'''
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']:

链接地址

    url = f'https://zhuanlan.zhihu.com/p/{index["id"]}'

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

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

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


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

提取整个文章数据 html

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

提取图片

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

提取需要被替换的内容

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

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

    for img_url, img in zip(img_url_list, img_list):

replace 字符串替换

        content = content.replace(img, img_url)

提取文章标题

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

字符串格式化方法

    html = html_str.format(article=content)

文件路径

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

写入数据

        f.write(html)

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

wkhtmltopdf 添加软件路径

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

尾语

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

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

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

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

文章来源:https://blog.csdn.net/m0_72282564/article/details/134879969
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。