一啥容、代碼
# 導包
import requests # 用于發(fā)送HTTP請求,獲取網(wǎng)頁數(shù)據(jù)
from bs4 import BeautifulSoup # 用于解析HTML內(nèi)容
import json # 用于處理和生成JSON文件
import pandas as pd # 用于數(shù)據(jù)處理和生成Excel文件
# 設(shè)置url地址(要爬取的PTT NBA版的網(wǎng)頁地址)
url = "xxxx"
# 設(shè)置headers(請求頭泼返,用于模擬瀏覽器請求绅喉,避免被網(wǎng)站識別為爬蟲)
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"}
# 接收響應
response = requests.get(url, headers=headers) # 發(fā)送GET請求渠鸽,獲取網(wǎng)頁內(nèi)容
# 根據(jù)響應狀態(tài)碼判斷網(wǎng)頁是否爬取成功
if response.status_code == 200: # 判斷請求是否成功
# 響應成功,寫入HTML文件中
print("寫入成功柴罐!")
with open("ptt_nba_2.html", "w", encoding="utf-8") as f: # 以寫入模式打開HTML文件
f.write(response.text) # 將網(wǎng)頁內(nèi)容寫入文件
else:
# 響應失敗徽缚,打印失敗信息
print("網(wǎng)頁爬取失敗革屠!")
# 使用bs4處理數(shù)據(jù)凿试,解析HTML內(nèi)容
bs = BeautifulSoup(response.text, "html.parser") # 將網(wǎng)頁文本用BeautifulSoup解析成HTML格式
articles = bs.find_all("div", class_="r-ent") # 查找所有包含文章信息的div標簽(class為r-ent)
data_list: list = [] # 用于存儲每篇文章數(shù)據(jù)的列表
for a in articles:
data_json: dict = {} # 用于存儲每篇文章的信息
# 處理標題
title = a.find("div", class_="title") # 查找標題所在的div
if title and title.a: # 如果找到了標題,并且它包含鏈接
title = title.a.text # 獲取標題文本
else:
title = "無標題" # 如果標題不存在似芝,則標記為“無標題”
data_json["標題"] = title # 將標題添加到data_json字典中
# 處理熱度(看板上的推文數(shù)量)
popular = a.find("div", class_="nrec") # 查找熱度所在的div
if popular and popular.span: # 如果熱度存在那婉,并且包含span標簽
popular = popular.span.text # 獲取熱度的文本
else:
popular = "N/A" # 如果沒有熱度,標記為“N/A”
data_json["熱度"] = popular # 將熱度添加到data_json字典中
# 處理日期
meta = a.find("div", class_="meta") # 查找包含文章元數(shù)據(jù)的div
date = meta.find("div", class_="date") # 查找日期所在的div
if date:
date = date.text # 獲取日期文本
else:
date = "N/A" # 如果沒有日期党瓮,標記為“N/A”
data_json["日期"] = date # 將日期添加到data_json字典中
data_list.append(data_json) # 將當前文章的信息添加到data_list中
# 生成json文件详炬,使用json.dump將數(shù)據(jù)存入文件
with open("ptt_nba_2.json", "w", encoding="utf-8") as file:
# ensure_ascii=False 用于保證中文能夠正確存入文件,indent=4 格式化輸出
json.dump(data_list, file, ensure_ascii=False, indent=4)
# 生成xlsx文件呛谜,使用pandas將數(shù)據(jù)存入Excel文件
pf = pd.DataFrame(data_list) # 將data_list轉(zhuǎn)換為pandas的DataFrame
# 保存為Excel文件瓷翻,不需要序號(index=False)韭脊,使用openpyxl解析引擎
pf.to_excel("ptt_nba_2.xlsx", index=False, engine="openpyxl")
二、生成的html文件截圖
image.png
三、生成的json文件截圖
image.png
四盛嘿、生成的xlsx文件截圖
image.png