小白学爬虫:一个简单的 BeautifulSoup 实战项目,爬取唐诗三百首,实现离线阅读(仅供交流学习)
·
前言
古诗文是中华传统文化的瑰宝,为了方便随时品读、复习背诵,本文使用 Python + requests + BeautifulS4 实现一个简单爬虫,批量爬取古诗文网《唐诗三百首》,按体裁分类保存为 TXT 文件,包含古诗原文 + 译文,实现真正离线阅读。
⚠️ 重要声明 本文仅用于编程技术学习与交流,所有爬取内容版权归原网站所有。请勿用于商业用途、批量下载传播或恶意访问服务器,遵守网站 robots 协议与法律法规。
一、项目功能
- 爬取古诗文网《唐诗三百首》全部诗歌
- 按五言古诗、七言古诗、五言律诗、七言律诗等体裁自动分类建文件夹
- 每首诗保存:标题 + 原文 + 译文
- 自动格式化文本,控制每行长度,阅读更舒适
- 异常捕获,单首诗下载失败不影响整体运行
二、环境准备
需要安装两个核心库:
pip install requests
pip install beautifulsoup4
pip install lxml
三、网站结构分析
目标地址:https://www.gushiwen.cn/gushi/tangshi.aspx
- 目录页按
div.class="typecont"分类 - 每一类下
span标签包含诗歌标题与链接 - 详情页正文:
div.class="contson" - 详情页译文:
div.class="contyishang"下第一个 p 标签
四、完整代码
import requests
from bs4 import BeautifulSoup
import os
import re
from urllib.parse import urljoin
# 创建总文件夹
file_dir = '唐诗三百首'
if not os.path.exists(file_dir):
os.mkdir(file_dir)
print(f'{file_dir} 目录创建成功')
base_url = 'https://www.gushiwen.cn/gushi/tangshi.aspx'
headers = {
'User-Agent': '',
'Referer': ''
}
# 获取目录页
try:
html_res = requests.get(base_url, headers=headers).content.decode('utf-8')
except Exception as e:
print(f'请求目录页出错:{str(e)}')
exit()
soup = BeautifulSoup(html_res, 'lxml')
div_list = soup.select('div[class="typecont"]')
# 遍历每个诗歌分类
for type_li in div_list:
# 获取分类名称,如“五言古诗”
type_title = type_li.select('div[class="bookMl"]')[0].get_text().strip()
# 该分类下所有诗歌
inner_content = type_li.select('span')
# 创建分类子文件夹
dir_inner = os.path.join(file_dir, type_title)
if not os.path.exists(dir_inner):
os.mkdir(dir_inner)
print(f'子目录 {type_title} 创建成功')
index = 0
# 遍历每一首诗
for span in inner_content:
index += 1
book_name = span.get_text().strip()
book_url = urljoin(base_url, span.select('a')[0]['href'])
try:
# 请求诗歌详情页
book_html = requests.get(book_url, headers=headers).content.decode('utf-8')
book_soup = BeautifulSoup(book_html, 'lxml')
# 提取正文
book_content_zhengwen = book_soup.select('div[class="contson"]')[0].get_text().strip()
# 提取译文
book_content_yiwen = book_soup.select('div[class="contyishang"] p')[0].get_text().strip()
# 格式化:每行最多100字符
def format_text(text, length=100):
text = text.replace('\xa0', '')
return '\n'.join([text[i:i+length] for i in range(0, len(text), length)])
zhengwen_formatted = format_text(book_content_zhengwen)
yiwen_formatted = format_text(book_content_yiwen)
# 拼接最终内容
book_content = f'{book_name}\n\n' \
f'{zhengwen_formatted}\n\n' \
f'【译文】\n{yiwen_formatted}'
# 保存文件
book_file_name = f'{index}_{book_name}.txt'
file_path = os.path.join(dir_inner, book_file_name)
with open(file_path, 'w', encoding='utf-8') as f:
f.write(book_content)
print(f'{book_name} 下载完成')
except Exception as e:
print(f'{book_name} 下载异常:{str(e)}')
print("所有诗歌爬取任务执行完毕!")
五、代码说明
-
文件夹结构
- 唐诗三百首 /
- 五言古诗 /
- 七言古诗 /
- 五言律诗 /
- ...
- 唐诗三百首 /
-
文本格式化
- 自动去除网页特殊空格
\xa0 - 每行控制在 100 字符内,手机 / 电脑阅读都舒适
- 自动去除网页特殊空格
-
异常处理
- 个别诗歌无译文、页面结构异常会自动跳过
- 不会因为单首失败导致程序崩溃
-
URL 拼接
- 使用
urljoin自动拼接相对链接,避免 404
- 使用
六、运行效果
运行后控制台输出类似:
唐诗三百首 目录创建成功
子目录 五言古诗 创建成功
春晓 下载完成
登鹳雀楼 下载完成
...
所有诗歌爬取任务执行完毕!
打开文件夹即可看到按分类整理好的 TXT,随时随地离线阅读。
免责声明
本文仅用于Python爬虫技术学习与交流,爬取的数据仅限个人学习使用,严禁用于商业用途、数据倒卖等违法行为。请遵守豆瓣网站robots协议及相关法律法规,合理使用爬虫技术,避免给网站服务器造成压力。
更多推荐
所有评论(0)