爬取CSDN专栏文章到本地,并保存为html、pdf、md格式

本文介绍如何使用Python爬取CSDN首页的专栏文章,并将其转换为HTML、PDF和Markdown格式。作者分享了面向对象的代码实现,包括requests、BeautifulSoup和相关库的使用。
摘要由CSDN通过智能技术生成

前言

  • 突然想爬取CSDN的专栏文章到本地保存了,为了影响小一点,特地挑选CSDN的首页进行展示。
  • 综合资讯这一测试点是什么找到的呢?就是点击下图的热点文章,然后跳转到具体文章

在这里插入图片描述
,然后再点击专栏文章,就进入了
在这里插入图片描述

废话少说,直接上代码

  • 用面向对象的思维实现了代码
  • 代码思路放在了代码注释里面
  • 用到了requests、bs4等主流接口
  • 剩下的就是,希望大家有空基于这个继续开发完善,哈哈哈哈!!!
  • 此代码和实现内容都已经打包上传只Gitee,可以点击查看
"""
@Author:survive
@Blog(个人博客地址): https://blog.csdn.net/haojie_duan
 
@File:csdn.py.py
@Time:2022/2/10 8:49
 
@Motto:我不知道将去何方,但我已在路上。——宫崎骏《千与千寻》

代码思路:
1.确定目标需求:将csdn文章内容保存成 html、PDF、md格式
    - 1.1首先保存为html格式:获取列表页中所有的文章ur1地址,请求文章ur1地址获取我们需要的文章内容
    - 1.2 通过 wkhtmitopdf.exe把html文件转换成PDF文件
    - 1.3 通过 wkhtmitopdf.exe把html文件转换成md文件

2.请求ur1获取网页源代码
3.解析数据,提取自己想要内容
4.保存数据
5.转换数据类型把HTML转换成PDF、md文伴
"""


html_str = """
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
{article}
</body>
</html>
"""

import requests
import parsel
import pdfkit   #用来将html转为pdf
import re
import os
import urllib.parse
from bs4 import BeautifulSoup
import html2text    #用来将html转换为md
import random

# user_agent库:每次执行一次访问随机选取一个 user_agent,防止过于频繁访问被禁止
USER_AGENT_LIST = [
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
    "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36"
]

class CSDNSpider():
    def __init__(self):
        self.url = 'https://blog.csdn.net/csdndevelopers/category_10594816.html'
        self.headers = {
            'user-agent':random.choice(USER_AGENT_LIST)
        }

    def send_request(self, url):
        response = requests.get(url=url, headers=self.headers)
        response.encoding = "utf-8"
        if response.status_code == 200:
            return response

    def parse_content(self, reponse):
        html = reponse.text
        selector = parsel.Selector(html)
        href = selector.css('.column_article_list a::attr(href)').getall()
        name = 00
        for link in href:
            print(link)
            name = name + 1
            # 对文章的url地址发送请求
            response = self.send_request(link)
            if response:
                self.parse_detail(response, name)

    def parse_detail(self, response, name):
        html = response.text
        # print(html)
        selector = parsel.Selector(html)
        title = selector.css('#articleContentId::text').get()
        # content = selector.css('#content_views').get()

        # 由于这里使用parsel拿到的网页文件,打开会自动跳转到csdn首页,并且不能转为pdf,就想在这里用soup
        soup = BeautifulSoup(html, 'lxml')
        content = soup.find('div',id="content_views",class_=["markdown_views prism-atom-one-light" , "htmledit_views"]) #class_="htmledit_views"
        # print(content)
        # print(title, content)
        html = html_str.format(article=content)
        self.write_content(html, title)

    def write_content(self, content, name):
        html_path = "HTML/" + str(self.change_title(name)) + ".html"
        pdf_path ="PDF/" + str(self.change_title(name))+ ".pdf"
        md_path = "MD/" + str(self.change_title(name)) + ".md"

        # 将内容保存为html文件
        with open(html_path, 'w',encoding="utf-8") as f:
            f.write(content)
            print("正在保存", name, ".html")

        # 将html文件转换成PDF文件
        config = pdfkit.configuration(wkhtmltopdf=r'G:\Dev\wkhtmltopdf\bin\wkhtmltopdf.exe')
        pdfkit.from_file(html_path, pdf_path, configuration=config)
        print("正在保存", name, ".pdf")
        # os.remove(html_path)

        # 将html文件转换成md格式
        html_text = open(html_path, 'r', encoding='utf-8').read()
        markdown = html2text.html2text(html_text)
        with open(md_path, 'w', encoding='utf-8') as file:
            file.write(markdown)
            print("正在保存", name, ".md")

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

    def start(self):
        response = self.send_request(self.url)
        if response:
            self.parse_content(response)


if __name__ == '__main__':
    csdn = CSDNSpider()
    csdn.start()

效果如下:

  • 从左到右,分别是html、pdf、md格式
    在这里插入图片描述
  • 随便点开一篇文章检查,从左到右,分别是html、pdf、md格式

在这里插入图片描述

后记

参考文章:

Python是一种功能强大的编程语言,可以用来开发各种各样的应用程序,而网络爬虫则是其最常用的领域之一。利用Python编写爬虫程序,可以从互联网上获取到各种各样的数据,如果你想爬取CSDN付费专栏,那么这里将会为你介绍如何实现。 首先,我们需要使用Python库中的requests库访问CSDN的网站,并模拟登录。CSDN付费专栏是需要购买的,因此我们必须先登录才能看到其内容。然后,我们需要使用BeautifulSoup库解析 HTML 页面,从而找到目标专栏页面的URL,进而获取其内容。最后,将爬取到的内容保存到本地文件中。 下面是具体实现的步骤: 1. 安装 requests、BeautifulSoup 和 pandas 这些或者其他需要的Python库 2. 使用 requests 库登录 CSDN 网站,并获取登录后的 Cookies 3. 利用 BeautifulSoup 库解析HTML页面,找到目标专栏的URL 4. 利用requests 库访问目标专栏的URL,获取HTML页面内容,并解析出所有文章的URL 5. 在每篇文章的页面中,使用 requests 库获取文章内容,并使用 BeautifulSoup 解析 6. 将文章内容保存到本地文件中,或者将其存储到数据库中。 虽然Python爬虫的过程相对简单,但是在爬取过程中也需要注意一些细节,例如请求频率、不要过度访问同一网站等问题。此外,由于CSDN的网站会采取一些反爬虫的策略, 因此,我们在编写爬虫程序时,也需要小心操作,避免被封禁。总之,爬取CSDN付费专栏需要一些技术和经验,需要认真研究和分析其网站结构和反爬虫策略,才能编写出高效、健壮、安全的爬虫程序。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰之行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值