Python 实现的采集诸葛灵签

Python 实现的采集诸葛灵签

项目介绍

这是一个基于 Python 开发的诸葛灵签数据采集和展示项目。通过爬虫技术获取诸葛神签的签文和解签内容,并提供数据存储和查询功能。

项目结构

zhuge/├── zhuge_scraper.py # 爬虫主程序├── zhuge_pages/ # 数据存储目录│   ├── all_signs.json # 汇总数据│   └── zhuge_sign_*.json # 单个签文数据└── zhuge.md # 项目说明文档

功能特点

  • 支持批量爬取 384 个诸葛神签
  • 自动将中文数字转换为阿拉伯数字
  • 数据以 JSON 格式保存
  • 实现断点续传和错误重试
  • 智能延时,避免请求过频
  • 双重保存机制(单独文件 + 汇总文件)

技术栈

  • Python 3.x
  • requests:网络请求
  • BeautifulSoup4:HTML 解析
  • json:数据序列化
  • re:正则表达式处理

核心功能模块

1. 中文数字转换

实现了将"三百八十四"等中文数字转换为阿拉伯数字的功能:

def chinese_to_arabic(chinese_num):# 将中文数字(如"三百八十四")转换为阿拉伯数字(384)

2. 页面解析

解析网页内容,提取签号、签文和解签信息:

def parse_zhuge_page(soup):# 解析页面内容,返回包含签号、签文和解签的字典

3. 数据爬取

处理单个页面的爬取和数据保存:

def scrape_zhuge_page(url):# 爬取单个页面并保存数据

4. 批量处理

控制批量爬取流程和请求频率:

def scrape_zhuge_range(start=1, end=384):# 批量爬取指定范围的签文

数据存储结构

数据以 JSON 格式存储,包含以下字段:

{"sign_number": "签号","sign_text": "签文内容","interpretation": "解签详解"
}

使用说明

环境准备

pip install requests beautifulsoup4

运行方式

python zhuge_scraper.py

数据输出

  • 单个签文:zhuge_pages/zhuge_sign_[编号].json
  • 汇总文件:zhuge_pages/all_signs.json

注意事项

  • 请合理控制爬取频率
  • 建议使用代理池轮换 IP
  • 数据仅供学习研究使用
  • 注意网站反爬虫机制

后续优化计划

  • 添加代理池支持
  • 优化中文数字转换算法
  • 添加数据验证机制
  • 实现更完善的错误处理
  • 添加日志记录系统

项目源码

import requests
from bs4 import BeautifulSoup
import os
import time
import random
import re
import jsondef chinese_to_arabic(chinese_num):"""将中文数字转换为阿拉伯数字"""cn_num = {'零': 0, '一': 1, '二': 2, '三': 3, '四': 4,'五': 5, '六': 6, '七': 7, '八': 8, '九': 9,'十': 10, '百': 100}result = 0temp_sum = 0temp_num = 0for char in chinese_num:curr_num = cn_num.get(char)if curr_num == 100:  # 百temp_sum += (temp_num if temp_num > 0 else 1) * curr_numtemp_num = 0elif curr_num == 10:  # 十temp_sum += (temp_num if temp_num > 0 else 1) * curr_numtemp_num = 0else:  # 个位数temp_num = curr_numresult = temp_sum + temp_numreturn resultdef parse_zhuge_page(soup):"""Parse a Zhuge divination page and extract key information."""# Find the sign numbersign_number_elem = soup.find('dt', text=re.compile(r'诸葛测算第[零一二三四五六七八九十百]+签结果'))if sign_number_elem:chinese_num = re.search(r'第([零一二三四五六七八九十百]+)签', sign_number_elem.text).group(1)sign_number = str(chinese_to_arabic(chinese_num))else:sign_number = None# Find the sign textsign_text_elem = soup.find('dd').find('em')sign_text = sign_text_elem.text.strip() if sign_text_elem else None# Find the detailed interpretationinterpretation_elems = soup.find_all('dd')[1].find_all('p')interpretation = '\n'.join([p.text.strip() for p in interpretation_elems])return {'sign_number': sign_number,'sign_text': sign_text,'interpretation': interpretation}def scrape_zhuge_page(url):try:# 更完整的请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Accept-Encoding': 'gzip, deflate, br','Connection': 'keep-alive','Referer': 'https://www.chazidian.com/','Upgrade-Insecure-Requests': '1'}# 增加重试机制max_retries = 3retry_delay = 5for attempt in range(max_retries):try:response = requests.get(url, headers=headers, timeout=15)response.raise_for_status()breakexcept requests.RequestException as e:if attempt == max_retries - 1:raiseprint(f"Attempt {attempt + 1} failed, retrying in {retry_delay} seconds...")time.sleep(retry_delay)# 其余代码保持不变soup = BeautifulSoup(response.text, 'html.parser')page_data = parse_zhuge_page(soup)# 创建目录os.makedirs('zhuge_pages', exist_ok=True)# 保存到单个文件和独立文件all_data_file = 'zhuge_pages/all_signs.json'# 读取现有数据(如果存在)existing_data = []if os.path.exists(all_data_file):with open(all_data_file, 'r', encoding='utf-8') as f:existing_data = json.load(f)# 追加新数据existing_data.append(page_data)# 保存所有数据with open(all_data_file, 'w', encoding='utf-8') as f:json.dump(existing_data, f, ensure_ascii=False, indent=2)# 同时保存单独的文件(保持原有功能)filename = f'zhuge_pages/zhuge_sign_{page_data["sign_number"]}.json'with open(filename, 'w', encoding='utf-8') as f:json.dump(page_data, f, ensure_ascii=False, indent=2)print(f"Successfully scraped and saved {url}")return page_dataexcept requests.RequestException as e:print(f"Error scraping {url}: {e}")return Nonedef scrape_zhuge_range(start=1, end=384):"""Scrape a range of Zhuge divination pagesArgs:start (int): Starting page numberend (int): Ending page number"""# Scrape pagesfor page_num in range(start, end + 1):url = f'https://www.chazidian.com/zhuge{page_num}/'print(f"Scraping page {page_num}...")# Scrape pagepage_data = scrape_zhuge_page(url)if page_data:# Random delay to be nice to the servertime.sleep(random.uniform(0.5, 2))# Optional: break if too many errors occurif page_num % 50 == 0:print(f"Paused at page {page_num}. Waiting a bit...")time.sleep(random.uniform(3, 7))def main():try:scrape_zhuge_range(1, 384)print("Scraping completed successfully!")except Exception as e:print(f"An error occurred during scraping: {e}")if __name__ == '__main__':main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/35339.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微服务日志收集①】使用FileBeat+Logstash+ES搭建ELK日志系统

使用FileBeatLogstashES搭建ELK日志系统,架构图如下: 1、 使用docker快速创建ES服务和Kibana服务 前置条件:需要在linux上提前安装好docker和docker-compose 1.1、在linux创建好一个用于存放docker-compose配置文件的文件夹 我的目录是/app/…

Centos 7 安装达梦数据库

一、环境准备 1. 确认操作系统的版本和数据库的版本是否一致 cat /etc/redhat-release 2. 关闭防火墙 查看防火墙状态 firewall-cmd --state 停止firewall systemctl stop firewalld.service 禁止firewall开机启动 systemctl disable firewalld.service 3. 修改文件l…

仿“东方甄选”直播商城小程序运营平台

在公域直播流量红利趋于饱和、流量成本大幅攀升的当下,私域直播为企业开辟了新的流量聚集和转化渠道,特别是对于那些希望在私域流量领域取得突破的品牌商家来说,直播场景以其独特的高频互动氛围,相比其他运营方式,展现…

ZED X系列双目3D相机的耐用性与创新设计解析

在工业自动化和学术研究领域,高精度的视觉设备正成为提升效率和质量的关键。ZED X系列AI立体相机,凭借其先进的技术和耐用的设计,为这一领域带来了新的可能。 核心技术:深度感知与精准追踪 ZED X系列的核心技术之一是Neural Dept…

Cursor的使用感受,帮你使用好自动化编程工具,整理笔记

使用感受 说实话,我觉得cursor还是好用的,可能我刚开始使用,没有使用的非常的熟练,运用也没有非常的透彻,总体体验还是不错的,在使用它时,我优先考虑,前端页面功能复用的时候&#…

《C#上位机开发从门外到门内》3-5:基于FastAPI的Web上位机系统

文章目录 一、项目概述二、系统架构设计三、前后端开发四、数据可视化五、远程控制六、系统安全性与稳定性七、性能优化与测试八、实际应用案例九、结论 随着互联网技术的快速发展,Web上位机系统在工业自动化、智能家居、环境监测等领域的应用日益广泛。基于FastAPI…

vue3单独引用element-plus的Infinite Scroll无限滚动;vue3自定义指令

文章目录 1.正常单独使用element-plus其他功能组件2.引入类似与指令的插件3.自定义指令钩子 1.正常单独使用element-plus其他功能组件 引入即可使用 import { ElSelect, ElOption } from "element-plus"2.引入类似与指令的插件 需要先引入,再注册&…

CMake学习笔记(二):变量设值,源文件/文件查找

一_变量设值: 在上一节中我们知道了如何去链接起来多个源文件并且生成可执行文件&#xff0c;但是当我们的源文件过多的时候会导致我们在add_executable里面写很长的一串&#xff0c;所以我们可以使用变量来进行设值: set(<variable> <value>... [PARENT_SCOPE])…

【Function】Azure Function通过托管身份或访问令牌连接Azure SQL数据库

【Function】Azure Function通过托管身份或访问令牌连接Azure SQL数据库 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 【Function】Azure Function通过托管身份或访问令牌连接Azu…

案例5_1:单位数码管显示0

文章目录 文章介绍效果图仿真图5_1放置单位数码管 代码5_1.c 文章介绍 效果图 仿真图5_1 复制案例1_2的仿真图&#xff0c;在此基础上修改 注意&#xff1a;栅格大小需要缩小 放置单位数码管 代码5_1.c #include <reg52.h>#define uchar unsigned char #define uint un…

helm部署metricbeat

背景 在Elastic Stack 7.5版本之前&#xff0c;系统默认采用内置服务进行监控数据采集&#xff08;称为内部收集机制&#xff09;&#xff0c;这种设计存在显著局限性&#xff1a; 当ES集群崩溃时自带的节点监控也会随之崩溃&#xff0c;直到集群恢复前&#xff0c;崩溃期间的…

基于 Python 爬取 TikTok 搜索数据 Tiktok爬虫(2025.3.17)

1. 前言 在数据分析和网络爬虫的应用场景中&#xff0c;我们经常需要获取社交媒体平台的数据&#xff0c;例如 TikTok。本篇文章介绍如何使用 Python 爬取 TikTok 用户搜索数据&#xff0c;并解析其返回的数据。 结果截图 2. 项目环境准备 在正式运行代码之前&#xff0c;我…

阿里云、腾讯云云主机如何提升远程桌面安全(VNC登录)

远程桌面连接&#xff08;RDP&#xff09;是管理主机的常用方式&#xff0c;但同时也带来了安全风险。黑客会对远程桌面进行暴力破解攻击和撞库攻击。作为云主机&#xff0c;在远程桌面方面有天然的安全优势&#xff1a;可以关闭远程桌面服务或端口&#xff0c;限制只能通过网页…

【etcd】

一、ETCD 简介 etcd是一个由CoreOS团队开发的开源项目&#xff0c;旨在提供一个高可用的、分布式的、一致的键值存储&#xff0c;用于配置共享和服务发现。尽管它看起来像一个键值存储&#xff0c;但etcd的设计目标远远超出了传统数据库的功能范围。 etcd的核心特性包括&…

深圳南柯电子|医疗设备EMC检测测试整改:保障患者安全的第一步

在医疗设备领域&#xff0c;电磁兼容性&#xff08;EMC&#xff09;是确保设备安全、有效运行的关键指标。随着医疗技术的飞速发展&#xff0c;医疗设备日益复杂&#xff0c;其电磁环境也愈发复杂多变。EMC检测测试及整改因此成为医疗设备研发、生产、销售过程中不可或缺的一环…

项目实战系列:基于瑞萨RA6M5构建多节点OTA升级-系统设计<一>

项目背景 原嵌入式控制系统采用分布式模块化架构&#xff0c;由12个功能板卡&#xff08;通信控制、信号采集、驱动执行等&#xff09;组成。系统维护阶段存在以下痛点&#xff1a; 低效的本地烧录机制&#xff1a;各板卡固件升级需通过JTAG接口逐一手动连接JLINK仿真器&#x…

五大方向全面对比 IoTDB 与 OpenTSDB

对比系列第三弹&#xff0c;详解 IoTDB VS OpenTSDB&#xff01; 之前&#xff0c;我们已经深入探讨了时序数据库 Apache IoTDB 与 InfluxDB、Apache HBase 在架构设计、性能和功能方面等多个维度的区别。还没看过的小伙伴可以点击阅读&#xff1a; Apache IoTDB vs InfluxDB 开…

RAGFlow部署与使用(开源本地知识库管理系统,包括kibana配置)

一、RAGFlow 简介 戳我访问RAGFlow RAGFlow 是一款基于深度文档理解构建的开源 RAG&#xff08;Retrieval-Augmented Generation&#xff09;引擎。它可以给我们搭建本地知识库&#xff0c;将用户的知识文档上传到RAGFlow后&#xff0c;通过文档切分、向量入库&#xff0c;在…

HTB 学习笔记 【中/英】《Web 应用 - 布局》P2

&#x1f4cc; 这篇文章讲了什么&#xff1f; 介绍了 Web 应用的架构和布局&#xff0c;包括不同的基础设施、组件、架构模式等。讲解了 常见的 Web 应用部署方式&#xff08;单服务器、多服务器等&#xff09;&#xff0c;并分析了它们的安全性。介绍了 微服务架构&#xff0…

蓝牙系统的核心组成解析

一、硬件层&#xff1a;看得见的物理载体 1. 射频模块&#xff08;Radio Frequency Module&#xff09; 专业描述&#xff1a;工作在2.4GHz ISM频段&#xff0c;支持GFSK/π/4 DQPSK/8DPSK调制方式 功能类比&#xff1a;相当于人的"嘴巴"和"耳朵" 发射端…