??博__主??:米碼收割機
??技__能??:C++/Python語言
??公眾號??:測試開發(fā)自動化【獲取源碼+商業(yè)合作】
??榮__譽??:阿里云博客專家博主、51CTO技術博主
??專__注??:專注主流機器人、人工智能等相關領域的開發(fā)、測試技術。
python天氣數(shù)據(jù)抓取與數(shù)據(jù)分析(源碼+論文)【獨一無二】
一、項目概述
本項目包括四個核心部分:數(shù)據(jù)爬取、數(shù)據(jù)存儲、數(shù)據(jù)分析和數(shù)據(jù)可視化。首先,利用Python編寫的網(wǎng)絡爬蟲從專業(yè)的歷史天氣網(wǎng)站上爬取大連市從2011年至2023年的天氣數(shù)據(jù),包括日期、最高氣溫、最低氣溫和天氣狀況等信息。爬取過程中應用了requests庫來模擬瀏覽器請求和lxml庫來解析HTML文檔,確保了數(shù)據(jù)的準確性和完整性。接著,將爬取到的數(shù)據(jù)存儲在兩個CSV文件中,并利用pymysql庫將數(shù)據(jù)導入MySQL數(shù)據(jù)庫,便于后續(xù)的數(shù)據(jù)處理和分析。在數(shù)據(jù)分析階段,使用pandas庫對CSV中的數(shù)據(jù)進行讀取和處理,計算出如每年的平均氣溫、最高氣溫的日期等關鍵統(tǒng)計信息。最后,利用pyecharts庫將分析結果以圖表的形式進行可視化展示,生成了五種圖表:各類天氣所占比例的餅圖、每年最高氣溫的日期折線圖、每年平均氣溫的柱狀圖、最高氣溫與最低氣溫的散點圖和最高氣溫分布的箱線圖。
二、項目環(huán)境需求
- 開發(fā)環(huán)境:Python3.7
- 運行系統(tǒng):Windows
- 軟件:Pycharm
三、數(shù)據(jù)庫設計
1)數(shù)據(jù)庫設計概述
本項目的數(shù)據(jù)庫設計關鍵在于有效地組織和存儲從網(wǎng)上爬取的大連市歷史天氣數(shù)據(jù)。為了實現(xiàn)這一目標,設計了兩個主要的數(shù)據(jù)表:weather_summary和daily_weather,以及相應的字段來存儲和索引數(shù)據(jù)。這些設計考慮到了數(shù)據(jù)的完整性、查詢效率和易于理解性。
weather_summary 表:
此表用于存儲每個月的天氣摘要信息,包括城市名、年份、月份以及對應的網(wǎng)頁URL。
字段設計:
- city (VARCHAR(255)):城市名稱,存儲城市名,如“大連”。
- year (INT):年份,存儲數(shù)據(jù)所屬的年份。
- month (INT):月份,存儲數(shù)據(jù)所屬的月份。
- url (VARCHAR(255)):URL地址,存儲爬取該月數(shù)據(jù)的網(wǎng)頁鏈接。
這個表有助于快速定位某個特定時間段的天氣數(shù)據(jù)來源和基本信息。
daily_weather 表:
此表更加詳細,用于存儲每天的天氣數(shù)據(jù),包括城市、日期、最高氣溫、最低氣溫和天氣狀況。
字段設計:
- city (VARCHAR(255)):城市名稱。
- date_time (DATE):日期,存儲每條記錄對應的具體日期。
- high (INT):最高氣溫,存儲當天的最高氣溫值。
- low (INT):最低氣溫,存儲當天的最低氣溫值。
- weather (VARCHAR(255)):天氣,存儲當天的天氣情況描述。
該表的設計允許進行詳細的日常天氣數(shù)據(jù)分析,如溫度變化、極端天氣事件等。
關注公眾號,回復 “天氣數(shù)據(jù)抓取” 獲取源碼
2)邏輯結構設計(E-R圖)
3)物理結構設計數(shù)據(jù)表
四、數(shù)據(jù)獲取實現(xiàn)
4.1 網(wǎng)絡請求
使用requests庫發(fā)起HTTP GET請求到目標網(wǎng)站。這里的目標網(wǎng)站是以https://lishi.xxx.com/xxx/YYYYMM.html格式的URL,其中YYYY和MM分別代表年份和月份。
為了避免被網(wǎng)站服務器識別為爬蟲,代碼中設置了請求頭headers,其中包含一個User-Agent,模仿常見瀏覽器的身份。
4.2 數(shù)據(jù)解析
使用lxml庫對響應的HTML內容進行解析。lxml是一個強大的庫,可以處理HTML和XML文檔,支持XPath查詢語言,用于提取HTML文檔中的數(shù)據(jù)。
代碼中利用etree.HTML(resp.text)將獲取的HTML文本轉換成了lxml的HTML對象,方便后續(xù)使用XPath進行數(shù)據(jù)提取。
4.3 提取具體數(shù)據(jù)
通過XPath定位HTML文檔中存儲天氣數(shù)據(jù)的部分,具體是尋找類名為thrui的ul元素下的所有l(wèi)i元素。對于每個li元素,代碼進一步提取了日期(date_time)、最高氣溫(high)、最低氣溫(low)和天氣狀況(weather)。
數(shù)據(jù)清洗:提取的氣溫數(shù)據(jù)中包含了攝氏度符號(℃),代碼中通過字符串操作去除這個符號,只保留溫度的數(shù)值部分。
主要代碼如下:
weather_info = [] # 新建一個列表,將爬取的每月數(shù)據(jù)放進去
# 請求頭信息:瀏覽器版本型號,接收數(shù)據(jù)的編碼格式
headers = {
# 必填,不填拿不到數(shù)據(jù)
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
# 請求 接收到了響應數(shù)據(jù)
resp = requests.get(url, headers=headers)
# 數(shù)據(jù)預處理
resp_html = etree.HTML(resp.text)
# xpath提取所有數(shù)據(jù)
resp_list = resp_html.xpath("http://ul[@class='thrui']/li")
# for循環(huán)迭代遍歷
五、數(shù)據(jù)存儲
5.1. CSV文件存儲
在項目中,CSV文件存儲是數(shù)據(jù)管理的重要環(huán)節(jié),利用Python的標準庫csv實現(xiàn)。這一過程首先通過open()函數(shù)打開或創(chuàng)建一個CSV文件,如dalian_weather.csv,以便寫入數(shù)據(jù)。這種文件格式的普遍兼容性使其成為數(shù)據(jù)共享和輕量級存儲的理想選擇。在寫入數(shù)據(jù)之前,通過csv.writer()函數(shù)創(chuàng)建一個寫入器對象,它是后續(xù)所有CSV操作的核心。
?????? 關注公眾號,回復 “天氣數(shù)據(jù)抓取” 獲取源碼??????文章來源地址http://www.zghlxwxcb.cn/news/detail-755230.html
weathers = []
message = []
for year in ['2023', '2022', '2021', '2020', '2019', '2018', '2017', '2016', '2015', '2014', '2013', '2012', '2011']:
# for循環(huán)生成有順序的1-12
for month in range(1, 13):
try:
# ... 忽略 ...
urls = {
f'https://xxx.xxx.com/xxx/{weather_time}.html': '大連'
}
for url, city in urls.items():
# 爬蟲獲取這個月的天氣信息
weather = getWeather(city, url)
# 存到列表中
weathers.append(weather)
message.append([city, year, month, url])
except Exception as e:
continue
print(weathers)
print(message)
# 數(shù)據(jù)寫入(一次性寫入)
with open("dalian_weather.csv", "w", newline='') as csvfile:
writer = csv.writer(csvfile)
# 先寫入列名:columns_name 日期 最高氣溫 最低氣溫 天氣
writer.writerow(["城市", "日期", "最高氣溫", "最低氣溫", '天氣'])
# 一次寫入多行用writerows(寫入的數(shù)據(jù)類型是列表,一個列表對應一行)
writer.writerows([list(day_weather_dict.values()) for month_weather in weathers for day_weather_dict in month_weather])
# 數(shù)據(jù)寫入(一次性寫入)
with open("dalian_weather_message.csv", "w", newline='') as csvfile:
writer = csv.writer(csvfile)
# 先寫入列名:columns_name 日期 最高氣溫 最低氣溫 天氣
writer.writerow(["城市", "年份", "月份", "url"])
# 一次寫入多行用writerows(寫入的數(shù)據(jù)類型是列表,一個列表對應一行)
writer.writerows(message)
5.2 SQL數(shù)據(jù)庫存儲
SQL數(shù)據(jù)庫存儲部分是項目中處理和維護大規(guī)模數(shù)據(jù)集的關鍵。使用pymysql庫與MySQL數(shù)據(jù)庫建立連接,此過程涉及數(shù)據(jù)庫的基本操作,如創(chuàng)建表格、插入數(shù)據(jù)和事務管理。在數(shù)據(jù)存儲的初始階段,代碼通過執(zhí)行SQL語句創(chuàng)建weather_summary和daily_weather兩個數(shù)據(jù)表,這些表格的設計旨在準確地反映天氣數(shù)據(jù)的結構和關系。其中,weather_summary表存儲每個月的天氣摘要。
# 第一組數(shù)據(jù)插入 weather_summary 表
with conn.cursor() as cursor:
sql = "INSERT INTO weather_summary (city, year, month, url) VALUES (%s, %s, %s, %s)"
cursor.executemany(sql, message)
# 第二組數(shù)據(jù)插入 daily_weather 表
data2 = []
for month_data in weathers:
for day_data in month_data:
record = (day_data['city'], day_data['date_time'], day_data['high'], day_data['low'], day_data['weather'])
6. 數(shù)據(jù)呈現(xiàn)
關注公眾號,回復 “天氣數(shù)據(jù)抓取”
7. 數(shù)據(jù)分析
(1)統(tǒng)計各類天氣所占比例
首先,使用pandas庫中的value_counts()方法來統(tǒng)計df[‘天氣’]列中各個唯一天氣類型的出現(xiàn)次數(shù)。這個方法返回一個新的Series對象,其索引是唯一的天氣類型,值是每種天氣類型的出現(xiàn)次數(shù)。接下來,使用pyecharts庫中的Pie類創(chuàng)建一個餅圖對象。Pie類是一個專門用于生成餅圖的類,能夠輕松地實現(xiàn)數(shù)據(jù)的可視化。
關注公眾號,回復 “天氣數(shù)據(jù)抓取” 獲取源碼
(2)統(tǒng)計每年中氣溫最高的日期
首先,代碼通過pd.to_datetime(df[‘日期’])將df中的’日期’列轉換為pandas的DateTime對象。這種轉換對于后續(xù)的日期處理和分析至關重要,因為它允許使用豐富的日期時間函數(shù)。利用DateTime對象的dt屬性,代碼提取了每條記錄的年份信息,并將其存儲在新的列’年份’中。這樣做便于按年份對數(shù)據(jù)進行分組和分析。使用groupby(‘年份’)對數(shù)據(jù)按年份進行分組,然后對每個分組應用idxmax()函數(shù)來找出最高氣溫出現(xiàn)的索引(即日期)。idxmax()函數(shù)返回的是最高氣溫值所在行的索引。
(3)統(tǒng)計每年氣溫的平均值
使用groupby(‘年份’)對df中的數(shù)據(jù)按照’年份’列進行分組。這意味著數(shù)據(jù)將根據(jù)年份被組織起來,每個組包含該年份的所有數(shù)據(jù)記錄。接著,應用agg函數(shù)對分組后的數(shù)據(jù)進行聚合計算。在這里,針對每個年份組,分別計算’最高氣溫’和’最低氣溫’的平均值(mean)。這一步驟提供了每年的平均最高氣溫和平均最低氣溫的關鍵數(shù)據(jù)。
(4)最高氣溫與最低氣溫的散點圖
通過繪制一個散點圖來探索最高氣溫和最低氣溫之間的關系。以下是對這部分代碼的詳細分析,使用pyecharts庫中的Scatter類來創(chuàng)建一個散點圖對象。散點圖是用于展示兩個變量之間關系的理想圖表,特別適合于揭示變量之間的相關性或模式。通過Scatter()構造函數(shù)初始化了一個散點圖實例。
設置X軸和Y軸數(shù)據(jù)使用add_xaxis()方法設置X軸數(shù)據(jù),這里選擇了df[‘最高氣溫’]作為X軸數(shù)據(jù),它代表數(shù)據(jù)集中記錄的每天的最高氣溫。
(5) 統(tǒng)計最高氣溫分布的箱線圖
創(chuàng)建溫度區(qū)間,利用pandas的cut函數(shù),代碼首先定義了一系列溫度區(qū)間(temp_bins),這些區(qū)間用于對最高氣溫數(shù)據(jù)進行分類。這些區(qū)間從-10℃開始,每個區(qū)間的跨度不同,直到超過數(shù)據(jù)集中的最高氣溫。pd.cut函數(shù)將df[‘最高氣溫’]中的每個值分配到這些預定義的區(qū)間中。結果存儲在新的列’溫度區(qū)間’中,為每個最高氣溫值標記了對應的溫度區(qū)間。
文章來源:http://www.zghlxwxcb.cn/news/detail-755230.html
?????? 關注公眾號,回復 “天氣數(shù)據(jù)抓取” 獲取源碼??????
到了這里,關于【Python】python天氣數(shù)據(jù)抓取與數(shù)據(jù)分析(源碼+論文)【獨一無二】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!