Beautiful Soup實戰案例:爬取"詩詞名句網"
目標
爬取"詩詞名句網"上的古典文學作品內容,包括書籍目錄和章節內容,并將每章內容獨立保存為文本文件。
目標網址: 《三國演義》全集在線閱讀_史書典籍_詩詞名句網
要求
-
書籍目錄管理:目錄名基于書籍名稱動態生成
-
目錄頁解析: 下載書籍目錄頁HTML、解析章節列表結構
-
章節信息提取: 構建完整章節URL(基礎URL + 相對路徑)
-
章節內容獲取: 下載各章節HTML內容
-
內容提取與處理: BS作為主要解析器、提取純文本內容(去除HTML標簽)
-
文件存儲規范: 文件名安全處理、使用章節名稱作為文件名
-
進度反饋: 目錄創建成功通知 、文件寫入成功確認等
代碼
import requests
from bs4 import BeautifulSoup
import re
import os
from urllib.parse import urljoin
?
# 創建目錄
if not os.path.exists('三國演義'):os.mkdir('三國演義')
?
# 目標網址
url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
?
# 偽裝瀏覽器
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0'
}
?
# 發送請求,獲取響應
response = requests.get(url, headers=headers)
# 進行編碼
response.encoding = 'utf-8'
# 轉成html對象,從而提取數據
html = BeautifulSoup(response.text,'lxml')
# 得到對象
tablis = html.select('a[class="tabli"]')
# 循環提取數據
for tabli in tablis:my_dict = {'章節名稱':'','詳情頁地址':''}tabli_name = tabli.get_text().strip()if tabli_name:# 將章節名稱進行特殊符號的替換safe_name = re.sub(r'[\\/*?<|>]','',tabli_name)my_dict['章節名稱'] = safe_nametabli_href = tabli.attrs.get('href')if tabli_href:# 建立完整的url地址new_href = urljoin('https://www.shicimingju.com/',tabli_href)my_dict['詳情頁地址'] = new_href# 發送二次請求,獲取詳情內容response_content = requests.get(new_href,headers=headers)response_content.encoding = 'utf-8'# 轉成html格式content_html = BeautifulSoup(response_content.text,'lxml')# 獲取文本對象div_content = content_html.select('div[class="text p_pad"]')# 提取文章內容content = div_content[0].get_text()
?# 寫入文件file_name = f'{safe_name}.txt'with open(os.path.join('三國演義',file_name),'w',encoding='utf-8') as f:f.write(content)print(my_dict)