Python爬取csnd文章,并转换为PDF文件

本篇文章流程(爬虫基本思路):

一. 数据来源分析 (只有当你找到数据来源的时候, 才能通过代码实现)

  1. 确定需求(要爬取的内容是什么?)
    爬取CSDN文章内容 保存pdf
  2. 通过开发者工具进行抓包分析 分析数据从哪里来的?

二. 代码实现过程

  1. 发送请求 对于文章列表页面发送请求
  2. 获取数据 获取网页源代码
  3. 解析数据 文章的url 以及 文章标题
  4. 发送请求 对于文章详情页url地址发送请求
  5. 获取数据 获取网页源代码
  6. 解析数据 提取文章标题 / 文章内容
  7. 保存数据 把文章内容保存成html文件
  8. 把html文件转成pdf文件
  9. 多页爬取

导入模块

import requests # 数据请求 发送请求 第三方模块 pip install requests
import parsel # 数据解析模块 第三方模块 pip install parsel
import os # 文件操作模块
import re # 正则表达式模块
import pdfkit # pip install pdfkit

 

创建文件夹

filename = 'pdf\\' # 文件名字
filename_1 = 'html\\'
if not os.path.exists(filename): #如果没有这个文件夹的话
    os.mkdir(filename) # 自动创建一下这个文件夹

if not os.path.exists(filename_1): #如果没有这个文件夹的话
    os.mkdir(filename_1) # 自动创建一下这个文件夹

 

发送请求

for page in range(1, 11):
    print(f'=================正在爬取第{page}页数据内容=================')
    url = f'https://blog.csdn.net/qdPython/article/list/{page}'
    # python代码对于服务器发送请求 >>> 服务器接收之后(如果没有伪装)被识别出来, 是爬虫程序, >>> 不会给你返回数据
    # 客户端(浏览器) 对于 服务器发送请求 >>> 服务器接收到请求之后 >>> 浏览器返回一个response响应数据
    # headers 请求头 就是把python代码伪装成浏览器进行请求
    # headers参数字段 是可以在开发者工具里面进行查询 复制
    # 并不是所有的参数字段都是需要的
    # user-agent: 浏览器的基本信息 (相当于披着羊皮的狼, 这样可以混进羊群里面)
    # cookie: 用户信息 检测是否登录账号 (某些网站 是需要登录之后才能看到数据, B站一些数据内容)
    # referer: 防盗链 请求你的网址 是从哪里跳转过来的 (B站视频内容 / 妹子图图片下载 / 唯品会商品数据)
    # 根据不同的网站内容 具体情况 具体分析
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
    }
    # 请求方式: get请求 post请求 通过开发者工具可以查看url请求方式是什么样的
    # 搜索 / 登录 /查询 这样是post请求
    response = requests.get(url=url, headers=headers)

 

数据解析

# 需要把获取到的html字符串数据转成 selector 解析对象
selector = parsel.Selector(response.text)
# getall 返回的是列表
href = selector.css('.article-list a::attr(href)').getall()

 

如果把列表里面每一个元素 都提取出来

for index in href:
    # 发送请求 对于文章详情页url地址发送请求
    response_1 = requests.get(url=index, headers=headers)
    selector_1 = parsel.Selector(response_1.text)
    title = selector_1.css('#articleContentId::text').get()
    new_title = change_title(title)
    content_views = selector_1.css('#content_views').get()
    html_content = html_str.format(article=content_views)
    html_path = filename_1 + new_title + '.html'
    pdf_path = filename + new_title + '.pdf'
    with open(html_path, mode='w', encoding='utf-8') as f:
        f.write(html_content)
        print('正在保存: ', title)

 

替换特殊字符

def change_title(name):
    mode = re.compile(r'[\\\/\:\*\?\"\<\>\|]')
    new_name = re.sub(mode, '_', name)
    return new_name

 

运行代码,即可下载HTML文件

转换成PDF文件

config = pdfkit.configuration(wkhtmltopdf=r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe')
pdfkit.from_file(html_path, pdf_path, configuration=config)

 

posted @ 2021-08-31 16:26  松鼠爱吃饼干  阅读(247)  评论(0编辑  收藏  举报
Title