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

前言

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

环境使用:

  • 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)

尾语 💝

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

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

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

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值