Welcome to kimi's blog

爬虫案例之博客生成markdown

爬取博客链接

首先,我们首先获取目标网址url,获取不同页的网址进行分析可知

第一页  https://www.cnblogs.com/zhanglanhua/
第二页  https://i.cnblogs.com/posts?page=2
第三页  https://i.cnblogs.com/posts?page=3

分析可知,第一页的网址应为:https://i.cnblogs.com/posts?page=1

可以使用range获取所有页的网址
详细参考test22

1. 利用range获取所有的网页

blog_page_link = 'https://www.cnblogs.com/zhanglanhua/?page=%s'
all_list = [] # 定义一个列表
for i in range(100):  # 确保100大于总页数
   page_link = blog_page_link % i

2. 请求获取网页文本模式

导入第三方requests模块,通过get爬取博客的网页信息,为了方便观看,使用文本模式(text)
  res = requests.get(page_link)
  data = res.text

3.获取网页接口连接

通过观察可知,引入re模块循环获取博客的每篇链接

 # 获取博客每篇文件的链接
   blog_link = re.findall('<a class="postTitle2 vertical-middle" href="(.*?)"', data)
   # print(blog_link)

4. 获取网页标题

 标题通过re模块的re.findall()是按照一行一行获取信息,但是博客的span标签是在a标签里面的,爬取不出来,因此我们使用bst模块的BeautifulSoup获取网页的标题
  from bs4 import BeautifulSoup
  soup = BeautifulSoup(data, 'lxml')
  # soup.find与soup.find_all都不能满足,只能使用select筛选器进行筛选
  temp_data = soup.select('a[class="postTitle2 vertical-middle"]') # 通过属性获取
  title_list = []
  for title in temp_data:
      blog_title = title.text.strip()  # 获取标签的文本信息
      title_list.append(blog_title)
  # print(title_list)

5. 拼接标题和链接

通过查看markdown底层代码,可以将标题和链接拼接成可以跳转的形式
image

	""" 爬取的数据都是字符串格式"""
    title_link_str = []
    for i_link, i_title in zip(blog_link, title_list):
        title_link = f'[{i_title}]({i_link})'
        # print(title_link)
        # print(type(title_link))  # <class 'str'>
        title_link_str.append(title_link)
    # print(title_link_str)
    all_list += title_link_str

all_list.reverse()
print(all_list)

进行数据分类,写入数据就是分类好的

  1. 因为标题是各异的,数据判断暂时是写死的,也可用for循环+if判断
  2. 定义好分类的空列表,对数据判断后分类追加
python = ['python知识扫盲', '计算机的基础知识', 'python基础知识与pycharm下载安装', '数据类型与逻辑运算',......
......

# 分类的空列表
python1 =[]
class1 =[]
.....
# 将对所有的内容进行分类,以便更好的写入文件
for line in all_list:
    line1 = line.lstrip('[')
    line2 = line1.split(']')[0]

    if line2 in python:
        python1.append(line)

    elif line2 in class1:
        class2.append(line)

    elif line2 in net_knowledge:
        net_knowledge1.append(line)

    elif line2 in database_knowledge:
        database_knowledge1.append(line)

    elif line2 in Front_end_knowledge:
        Front_end_knowledge1.append(line)

    elif line2 in django_knowledge:
        django_knowledge1.append(line)

    elif line2 in linux_knowledge:
        linux_knowledge1.append(line)

    elif line2 in ATM:
        ATM1.append(line)
    else:
        other1.append(line)

7.写入markdown文件

# 写入markdown文章
with open(r'blog_link.md', 'w', encoding='utf8') as f:
    f.write('# 我的博客导航\n')
    f.write('## python基础知识\n')
    for python in python1:
        f.writelines('* ' + python + '\n')
    f.write('## python面向对象\n')
    for class3 in class2:
        f.writelines('* ' + class3 + '\n')

    f.write('## 网络编程并发编程\n')
    for net_know in net_knowledge1:
        f.writelines('* ' + net_know + '\n')

    f.write('## 数据库\n')
    for db in database_knowledge1:
        f.writelines('* ' + db + '\n')

    f.write('## 前端编程\n')
    for front in Front_end_knowledge1:
        f.writelines('* ' + front + '\n')

    f.write('## django\n')
    for django1 in django_knowledge1:
        f.writelines('* ' + django1 + '\n')

    f.write('## 项目\n')
    for atm in ATM1:
        f.writelines('* ' + atm + '\n')

    f.write('## 其他\n')
    for ot in other1:
        f.writelines('* ' + ot + '\n')

posted @ 2023-01-30 16:54  魔女宅急便  阅读(66)  评论(0)    收藏  举报
Title