爬虫案例之博客生成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底层代码,可以将标题和链接拼接成可以跳转的形式

""" 爬取的数据都是字符串格式"""
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
6.title_link_str是字符串集合的列表且顺序是反,需要将列表的字符串顺序颠倒过来
all_list.reverse()
print(all_list)
进行数据分类,写入数据就是分类好的
- 因为标题是各异的,数据判断暂时是写死的,也可用for循环+if判断
- 定义好分类的空列表,对数据判断后分类追加
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')

浙公网安备 33010602011771号