Python实战:构建个人古诗知识库,从古诗文网高效采集与存储
1. 为什么你需要一个古诗知识库作为一个诗词爱好者我经常遇到这样的困扰读到一首好诗想收藏结果过几天就忘了出处想查找某个主题的诗句却记不清具体内容看到喜欢的诗人作品想系统研究却找不到完整资料。这些问题促使我开发了这套古诗采集系统。古诗知识库的价值远不止于简单的收藏。它可以帮你建立个人诗词索引随时检索调用按作者、朝代、主题进行多维分类积累写作素材提升文学修养为后续的知识图谱构建打下基础我选择古诗文网作为数据源因为它收录全面、分类清晰而且页面结构相对稳定。通过Python爬虫技术我们可以把这些散落在网页上的珍贵资料变成结构化的个人知识资产。2. 环境准备与项目配置2.1 基础环境搭建首先确保你的电脑已经安装Python 3.7版本。我强烈建议使用虚拟环境来管理依赖这样可以避免包冲突。下面是具体操作步骤# 创建并激活虚拟环境 python -m venv poetry_env source poetry_env/bin/activate # Linux/Mac poetry_env\Scripts\activate.bat # Windows # 克隆项目仓库 git clone https://github.com/palp1tate/fetch-gushiwen.git cd fetch-gushiwen # 安装依赖 pip install -r requirements.txt主要依赖包包括requests网络请求beautifulsoup4HTML解析PyYAML配置文件读取pymysqlMySQL数据库连接2.2 数据库配置可选如果你想将数据存入MySQL需要先创建数据库CREATE DATABASE gushiwen CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;然后修改项目根目录下的config.yaml文件mysql: host: localhost port: 3306 user: your_username password: your_password db: gushiwen建议使用Navicat等工具导入项目中的poem.sql文件这会自动创建好数据表结构。表设计包含了诗歌名称、作者、朝代、内容等完整字段还支持后续扩展。3. 核心爬虫实现解析3.1 网页请求与反爬策略古诗文网虽然没有特别严格的反爬机制但我们仍需要遵守基本的爬虫礼仪headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Accept-Language: zh-CN,zh;q0.9, Referer: https://www.gushiwen.cn/ } def get_page(url): try: response requests.get(url, headersheaders, timeout10) response.raise_for_status() response.encoding utf-8 return response.text except Exception as e: print(f请求失败: {e}) return None关键点设置合理的User-Agent模拟浏览器控制请求频率建议添加time.sleep(1)处理各种网络异常情况遵守robots.txt的规则3.2 数据解析技巧诗歌页面的解析是核心难点。以这首《行宫》为例我们需要从HTML中提取多个字段def parse_poem(html): soup BeautifulSoup(html, html.parser) poem { name: soup.find(h1).text.strip(), author: soup.select(.source a)[0].text, dynasty: soup.select(.source a)[1].text, content: \n.join([p.text for p in soup.select(.contson p)]), trans: soup.find(div, class_contyishang).text if soup.find(div, class_contyishang) else , # 其他字段类似处理... } return poem实际项目中我遇到了几个坑部分古诗没有译文或注释作者信息有时包含特殊符号内容中的换行符处理需要特别注意建议添加完善的异常处理确保某个字段缺失时不影响整体采集。4. 数据存储方案对比4.1 CSV文件存储对于初学者CSV是最简单的存储方式。项目中的shige_csv.py已经实现了这个功能import csv def save_to_csv(poems, filenamepoems.csv): with open(filename, a, encodingutf-8, newline) as f: writer csv.DictWriter(f, fieldnamespoems[0].keys()) if f.tell() 0: writer.writeheader() writer.writerows(poems)CSV的优势无需数据库环境文件可以直接用Excel打开适合小规模数据万条以内但超过10万条数据后查询效率会明显下降。4.2 MySQL数据库存储对于大规模数据我推荐使用MySQL。项目中的shige_db.py展示了完整实现import pymysql def save_to_db(poem): conn pymysql.connect(**config) try: with conn.cursor() as cursor: sql INSERT INTO poems (name,author,dynasty,content,trans,...) VALUES (%s,%s,%s,%s,%s,...) cursor.execute(sql, (poem[name], poem[author],...)) conn.commit() finally: conn.close()数据库方案的优势支持复杂查询如查找所有李白的七言诗便于后续扩展为知识图谱适合长期积累大量数据我在实际使用中发现添加适当的索引可以大幅提升查询速度ALTER TABLE poems ADD INDEX idx_author (author); ALTER TABLE poems ADD FULLTEXT INDEX idx_content (content);5. 高级应用与扩展思路5.1 定时增量采集为了避免重复采集可以记录已爬取的URLimport pickle class UrlManager: def __init__(self): try: with open(urls.pkl, rb) as f: self.existed_urls pickle.load(f) except: self.existed_urls set() def save(self): with open(urls.pkl, wb) as f: pickle.dump(self.existed_urls, f)结合Linux的crontab或Windows的任务计划程序可以实现每日自动采集新诗# 每天凌晨2点运行 0 2 * * * /path/to/python /project/shige_db.py5.2 构建知识图谱有了基础数据后可以进一步构建关系网络诗人关系图通过共同创作、引用等建立连接诗歌主题网络分析高频词关联时空分布图按朝代和地域可视化这需要用到Neo4j等图数据库以及jieba分词、Gensim等文本处理工具。5.3 开发Web界面用Flask或Django搭建一个简单的查询界面from flask import Flask, request app Flask(__name__) app.route(/search) def search(): keyword request.args.get(q) # 数据库查询逻辑 return render_template(results.html, poemspoems)这样就能随时随地通过浏览器访问自己的古诗库了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2469243.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!