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.pswp.cn/news/897880.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897880.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897880.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++項目實戰】校園公告搜索引擎:完整實現與優化指南

🎬 個人主頁:誰在夜里看海. 📖 個人專欄:《C系列》《Linux系列》《算法系列》 ?? 道阻且長,行則將至 目錄 📚一、項目概述 📖1.項目背景 📖2.主要功能 📖3.界面展…

代理(Delegate)、閉包(Closure)、Notification(通知中心) 和 swift_event_bus適用場景和工作方式

在 Swift 開發中,在 Swift 開發中,代理(Delegate)、閉包(Closure)、Notification(通知中心) 和 swift_event_bus 主要用于 組件之間的通信,但它們的適用場景和工作方式有…

設計模式--單例模式(Singleton)【Go】

引言 在設計模式中,單例模式(Singleton Pattern)是一種非常常見且實用的模式。它的核心思想是確保一個類只有一個實例,并提供一個全局訪問點。這種模式在需要全局唯一對象的場景中非常有用,比如配置管理、日志記錄、數…

MySQL數據庫復制

文章目錄 MySQL數據庫復制一、復制的原理二、復制的搭建1.編輯配置文件2.在主庫上創建復制的用戶3.獲取主庫的備份4.基于從庫的恢復5.建立主從復制6.開啟主從復制7.查看主從復制狀態 MySQL數據庫復制 MySQL作為非常流行的數據庫,支撐它如此出彩的因素主要有兩個&am…

Sourcetree——使用.gitignore忽略文件或者文件夾

一、為何需要文件忽略機制? 1.1 為什么要會略? 對于開發者而言,明智地選擇忽略某些文件類型,能帶來三大核心優勢: 倉庫純凈性:避免二進制文件、編譯產物等污染代碼庫 安全防護:防止敏感信息&…

基于yolov8+streamlit實現目標檢測系統帶漂亮登錄界面

【項目介紹】 基于YOLOv8和Streamlit實現的目標檢測系統,結合了YOLOv8先進的目標檢測能力與Streamlit快速構建交互式Web應用的優勢,為用戶提供了一個功能強大且操作簡便的目標檢測平臺。該系統不僅具備高精度的目標檢測功能,還擁有一個漂亮且…

分享vue好用的pdf 工具實測

vue3-pdf-app: 帶大綱,帶分頁,帶縮放,帶全屏,帶打印,帶下載,帶旋轉 下載依賴: yarn add vue3-pdf-appornpm install vue3-pdf-app 配置類: 創建文件 pdfConfig.ts /…

基于微信小程序開發的寵物領養平臺——代碼解讀

項目前端 一、項目的技術架構概況 一句話概括:該項目是基于微信小程序開發的寵物領養平臺,采用原生小程序框架進行用戶界面的構建,使用 wx.request 進行 API 請求,并通過 getApp() 和本地存儲來管理全局狀態和用戶信息。 一&am…

最完美的WPF無邊框設計!

常規的無邊框方法設計 常規的WPF無邊框設計方法都是通過AllowsTransparency="True"和WindowStyle=“None”,并且使用WindowChrome樣式來實現,但是這樣會有問題就是,窗體最大化的時候將底部任務欄給擋住了,另外最大化的時候不能拖動窗體。參考這個大佬的設計@ 若…

【區塊鏈】btc

學習視頻源鏈接: https://www.bilibili.com/video/BV1Vt411X7JF/ 本文是根據肖老師的視頻進行的筆記記錄 一、 cryptographic hash function 1.1. collision resistance抗碰撞性 : collision 指的是hash碰撞 抗碰撞性 (Collision Resistance) 是密碼…

C語言【數據結構】:時間復雜度和空間復雜度.詳解

引言 詳細介紹什么是時間復雜度和空間復雜度。 前言:為什么要學習時間復雜度和空間復雜度 算法在編寫成可執行程序后,運行時需要耗費時間資源和空間(內存)資源。因此衡量一個算法的好壞,一般是從時間和空間兩個維度來衡量的,即時…

QT:文件讀取

問題: 在文件讀取,判斷md5值時,遇到py文件讀取轉String后,再轉byte,md5前后不一致問題。 解決方法: python文件讀取要使用QTextStream,避免\t 、\r、\n的換行符跨平臺問題(window…

32單片機——LED

LED原理圖如圖所示: 代碼 DS0和DS1每過500ms一次交替閃爍,實現類似跑馬燈的效果 GPIO輸出配置步驟 (1)使能對應GPIO時鐘 STM32在使用任何外設之前,我們都要先使能其時鐘(下同)。本實驗用到…

貪心算法和遺傳算法優劣對比——c#

項目背景:某鋼管廠的鋼筋原材料為 55米,工作需要需切割 40 米(1段)、11 米(15 段)等 4 種規格 ,現用貪心算法和遺傳算法兩種算法進行計算: 第一局:{ 40, 1 }, { 11, 15…

【Java篇】一法不變,萬象歸一:方法封裝與遞歸的思想之道

文章目錄 Java 方法的使用:從基礎到遞歸的全面解析一、方法的概念及使用1.1 什么是方法 (method)?1.2 方法定義1.3 方法調用的執行過程1.4 實參和形參的關系1.5 沒有返回值的方法 二、方法重載2.1 為什么需要方法重載2.2 方法重載的概念2.2.4 C 和 Java 的比較&…

深入理解 HTML 中的<div>和元素:構建網頁結構與樣式的基石

一、引言 在 HTML 的世界里&#xff0c;<div>和元素雖看似普通&#xff0c;卻扮演著極為關鍵的角色。它們就像網頁搭建過程中的萬能積木&#xff0c;能夠將各種 HTML 元素巧妙地組合起來&#xff0c;無論是構建頁面布局&#xff0c;還是對局部內容進行樣式調整&#xff…

《大語言模型》學習筆記(一)

一、什么是大語言模型 大語言模型是指在海量無標注文本數據上進行預訓練得到的大型預訓練語言模型&#xff0c;例如GPT-3&#xff0c;PaLM和LLaMA。大語言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;是一種基于深度學習的自然語言處理模型&#xff0c;能…

電力行業中分布式能源管理(Distributed Energy Management System, DEMS)的實現

以下是電力行業中分布式能源管理(Distributed Energy Management System, DEMS)的實現方案,涵蓋系統架構、關鍵技術、核心功能及實施路徑,結合典型場景與代碼示例: 一、系統架構設計 采用云-邊-端三層架構,實現分布式能源的高效協同管理: 1. 終端層(感知層) 設備組…

實驗5 邏輯回歸

實驗5 邏輯回歸 【實驗目的】掌握邏輯回歸算法 【實驗內容】處理樣本&#xff0c;使用邏輯回歸算法進行參數估計&#xff0c;并畫出分類邊界 【實驗要求】寫明實驗步驟&#xff0c;必要時補充截圖 1、參照“2.1梯度下降法實現線性邏輯回歸.ipynb”和“2.2 sklearn實現線性邏輯…

思維訓練讓你更高、更強 |【邏輯思維能力】「刷題訓練筆記」假設法模式邏輯訓練題(1-5)

每日一刷 思維訓練讓你更高、更強&#xff01; 題目1 誰在說謊&#xff0c;誰拿走了零錢&#xff1f; 姐姐上街買菜回來后&#xff0c;就隨手把手里的一些零錢放在了抽屜里&#xff0c;可是&#xff0c;等姐姐下午再去拿錢買菜的時候發現抽屜里的零錢沒有了&#xff0c;于是&…