前言

古诗文是中华传统文化的瑰宝,为了方便随时品读、复习背诵,本文使用 Python + requests + BeautifulS4 实现一个简单爬虫,批量爬取古诗文网《唐诗三百首》,按体裁分类保存为 TXT 文件,包含古诗原文 + 译文,实现真正离线阅读。

⚠️ 重要声明 本文仅用于编程技术学习与交流,所有爬取内容版权归原网站所有。请勿用于商业用途、批量下载传播或恶意访问服务器,遵守网站 robots 协议与法律法规。


一、项目功能

  1. 爬取古诗文网《唐诗三百首》全部诗歌
  2. 五言古诗、七言古诗、五言律诗、七言律诗等体裁自动分类建文件夹
  3. 每首诗保存:标题 + 原文 + 译文
  4. 自动格式化文本,控制每行长度,阅读更舒适
  5. 异常捕获,单首诗下载失败不影响整体运行

二、环境准备

需要安装两个核心库:

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("所有诗歌爬取任务执行完毕!")

五、代码说明

  1. 文件夹结构

    • 唐诗三百首 /
      • 五言古诗 /
      • 七言古诗 /
      • 五言律诗 /
      • ...
  2. 文本格式化

    • 自动去除网页特殊空格 \xa0
    • 每行控制在 100 字符内,手机 / 电脑阅读都舒适
  3. 异常处理

    • 个别诗歌无译文、页面结构异常会自动跳过
    • 不会因为单首失败导致程序崩溃
  4. URL 拼接

    • 使用 urljoin 自动拼接相对链接,避免 404

六、运行效果

运行后控制台输出类似:

唐诗三百首 目录创建成功
子目录 五言古诗 创建成功
春晓 下载完成
登鹳雀楼 下载完成
...
所有诗歌爬取任务执行完毕!

打开文件夹即可看到按分类整理好的 TXT,随时随地离线阅读。

免责声明

本文仅用于Python爬虫技术学习与交流,爬取的数据仅限个人学习使用,严禁用于商业用途、数据倒卖等违法行为。请遵守豆瓣网站robots协议及相关法律法规,合理使用爬虫技术,避免给网站服务器造成压力。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐