python 从CSDN上下载博客并保存为md文件

代码不是原创的,是从下面两个博客中拼接来的,侵删。
https://blog.csdn.net/xixihahalelehehe/article/details/124549528
https://blog.csdn.net/biggbang/article/details/121392167
生成的md文件保存在py文件同级目录下,并根据分类自动创建文件夹

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
import os
import uuid
import time
import requests
import datetime
import argparse
import re
from bs4 import BeautifulSoup
import re
import parsel
import tomd
import requests

parser = argparse.ArgumentParser()
#修改成CSDN的usename即可
parser.add_argument('-i', '--id', type=str, default='default', help='csdn name')
args = parser.parse_args()

def spider_csdn(title_url, dir):
  # 目标文章的链接
  head={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Edg/84.0.522.52"
  }
  html=requests.get(url=title_url,headers=head).text
  page=parsel.Selector(html)
  #创建解释器
  title=page.css(".title-article::text").get()
  res = re.compile("[^\u4e00-\u9fa5^a-z^A-Z^0-9]")
  restr = ''
  res.sub(restr, title)
  content=page.css("article").get()
  content=re.sub("<a.*?a>","",content)
  content = re.sub("<br>", "", content)
  texts=tomd.Tomd(content).markdown
  #转换为markdown 文件
  title = title.split('/')[-1]
  title = title.replace('?', '')
  title = title.replace('*', '')
  title = title.replace(':', '')
  title = title.replace('"', '')
  title = title.replace('<', '')
  title = title.replace('>', '')
  title = title.replace('\\', '')
  title = title.replace('/', '')
  title = title.replace('|', '')
  title = dir + "/" + title
  with open(title+".md",mode="w",encoding="utf-8") as f:
    f.write("#"+title)
    f.write(texts)


def request_blog_column(id):
  headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36'
  }

  urls = 'https://blog.csdn.net/' + id
  reply = requests.get(url=urls, headers=headers)
  parse = BeautifulSoup(reply.content, "lxml")
  spans = parse.find_all('a', attrs={'class': 'special-column-name'})

  blog_columns = []

  for span in spans:
    href = re.findall(r'href=\"(.*?)\".*?', str(span), re.S)
    href = ''.join(href)

    headers = {
      'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36'
    }
    blog_column_reply = requests.get(url=href, headers=headers)
    blogs_num = re.findall(
      r'<a class="clearfix special-column-name" target="_blank" href=\"' + href + '\".*?<span class="special-column-num">(.+?)篇</span>',
      blog_column_reply.text, re.S)
    blogs_column_num = str(blogs_num[0])

    blog_column = span.text.strip()

    blog_column_dir = './' + str(id) + '/' + str(blog_column)
    if not os.path.exists(blog_column_dir):
      os.makedirs(blog_column_dir)

    blog_id = href.split("_")[-1]
    blog_id = blog_id.split(".")[0]
    blog_columns.append([href, blog_column, blog_id, blogs_column_num])

  return blog_columns


def request_blog_list(id):
  blog_columns = request_blog_column(id)
  blogs = []
  for blog_column in blog_columns:
    blog_column_url = blog_column[0]
    blog_column_name = blog_column[1]
    blog_column_id = blog_column[2]
    blog_column_num = int(blog_column[3])

    if blog_column_num > 40:
      page_num = round(blog_column_num / 40)
      for i in range(page_num, 0, -1):
        blog_column_url = blog_column[0]
        url_str = blog_column_url.split('.html')[0]
        blog_column_url = url_str + '_' + str(i) + '.html'
        append_blog_info(blog_column_url, blog_column_name, blogs)
      blog_column_url = blog_column[0]
      blogs = append_blog_info(blog_column_url, blog_column_name, blogs)

    else:
      blogs = append_blog_info(blog_column_url, blog_column_name, blogs)

  return blogs


def append_blog_info(blog_column_url, blog_column_name, blogs):
  headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36'
  }
  reply = requests.get(url=blog_column_url, headers=headers)
  blog_span = BeautifulSoup(reply.content, "lxml")
  blogs_list = blog_span.find_all('ul', attrs={'class': 'column_article_list'})
  for arch_blog_info in blogs_list:
    blogs_list = arch_blog_info.find_all('li')
    for blog_info in blogs_list:
      blog_url = blog_info.find('a', attrs={'target': '_blank'})['href']
      blog_title = blog_info.find('h2', attrs={'class': "title"}).get_text().strip().replace(" ", "_").replace('/', '_')
      blog_dict = {'column': blog_column_name, 'url': blog_url, 'title': blog_title}
      blogs.append(blog_dict)
  return blogs


def request_md(userName):
  blogs = request_blog_list(userName)
  for blog_dict in blogs:
    blog_url = blog_dict['url']
    blog_title = blog_dict['title']
    blog_column = blog_dict['column']
    blog_id = blog_url.split("/")[-1]
    url = "https://blog.csdn.net/" + userName + "/article/details/" + blog_id
    dir = userName + '/' + blog_column
    spider_csdn(url, dir)


def read_from_json(filename):
  jsonfile = open(filename, "r", encoding='utf-8')
  jsondata = jsonfile.read()
  return json.loads(jsondata)


def write_to_json(filename, data):
  jsonfile = open(filename, "w")
  jsonfile.write(data)


def main():
  csdn_id = args.id

  name_dir = './' + str(csdn_id)
  if not os.path.exists(name_dir):
    os.mkdir(name_dir)

  request_md(csdn_id)


if __name__ == '__main__':
  main()









Python中,可以使用hashlib模块进行MD5加密操作。引用\[1\]中的代码示例展示了如何使用md5函数进行加密。该函数接受一个需要加密的字符串作为参数,并可以自定义输出的MD5长度(16位或32位)以及MD5加密后的字符串为大写或小写。该函数返回一个JSON格式的字符串,可以使用json.loads函数解析得到MD5值。例如,使用md5函数对字符串'admin'进行加密,可以得到以下结果: 32位小写:21232f297a57a5a743894a0e4a801fc3 16位大写:297A57A5A743894A 32位大写:21232F297A57A5A743894A0E4A801FC3 MD5加密在实际应用中有多种用途,如引用\[2\]所示: - 在注册用户时,可以对密码进行MD5加密,只保存加密后的结果,以增加安全性。 - 在存储文件时,可以使用文件MD5值作为文件名,以保证文件的唯一性。 - 在使用key-value数据库时,可以使用MD5值作为key。 - 在比较两个文件是否相同时,可以通过比较文件MD5值来判断文件是否被篡改。 引用\[3\]中的代码示例展示了如何使用hashlib模块进行MD5操作。首先创建一个md5对象,然后使用update方法指定需要加密的字符串,最后使用hexdigest方法获取加密后的字符串。 总结来说,Python中的MD5加密可以通过hashlib模块实现,可以用于保护密码安全、文件唯一性验证等多种场景。 #### 引用[.reference_title] - *1* [python中的md5加密的使用](https://blog.csdn.net/weixin_44213550/article/details/129219158)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [python实现md5加密](https://blog.csdn.net/weixin_40400335/article/details/128713786)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [pythonmd5](https://blog.csdn.net/sueong/article/details/118670466)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值