資料採集與融合技術實踐課第二次作業
這個作業屬於哪個課程 | https://edu.cnblogs.com/campus/fzu/2024DataCollectionandFusiontechnology |
---|---|
碼雲作業gitee倉庫 | https://gitee.com/huang-yuejia/DataMining_project/tree/master/work2 |
學號 | 102202142 |
姓名 | 黃悅佳 |
目錄
- 資料採集與融合技術實踐課第二次作業
- 一、作業內容
- 作業①:
- 1.爬取城市天氣資訊(程式碼在課程作業基礎上改進最佳化)
- 2.心得體會
- 作業②:
- 1.爬取股票資訊(採用抓包方式)(作業2)
- 2.心得體會
- 作業③:
- 1.爬取大學排名-抓包方式(作業3)
- 2.心得體會
- 二、作業總結
- 難點與挑戰:
- 解決思路:
- 新知識與收穫:
- 一、作業內容
一、作業內容
作業①:
- 要求:在中國氣象網(http://www.weather.com.cn)給定城市集的7日天氣預報,並儲存在資料庫。
1.爬取城市天氣資訊(程式碼在課程作業基礎上改進最佳化)
本作業原始碼連結:https://gitee.com/huang-yuejia/DataMining_project/blob/master/work2/2.1
- 結果展示:
爬取過程
儲存到資料庫
- 關鍵程式碼展示:
輸出爬取處理
獲取資料
def fetch_weather_data(self, city):
url = f"http://www.weather.com.cn/weather/{self.cityCode[city]}.shtml"
try:
req = urllib.request.Request(url, headers=self.headers)
with urllib.request.urlopen(req) as response:
data = response.read()
dammit = UnicodeDammit(data, ["utf-8", "gbk"])
return dammit.unicode_markup
except Exception as e:
print(f"Error fetching weather data for {city}: {e}")
return None
處理資料
soup = BeautifulSoup(html_data, "lxml")
lis = soup.select("ul[class='t clearfix'] li")
for li in lis:
try:
date = li.select('h1')[0].text.strip()
weather = li.select('p[class="wea"]')[0].text.strip()
msg = li.select('')[0].text.strip()
temp = li.select('p[class="tem"] span')[0].text.strip() + "/" + li.select('p[class="tem"] i')[
0].text.strip()
print(f"{city}, {date}, {weather},{msg}, {temp}")
self.db.insert(city, date, weather,msg, temp)
except Exception as e:
print(f"Error processing data for {city}: {e}")
2.心得體會
- 透過查詢不同的城市程式碼篩選指點的城市資訊,同時加入資料庫的使用,使處理得到的資料能夠更直觀的展示,並便於下一步的處理分析。
作業②:
- 要求:要求:用 requests 和 BeautifulSoup 庫方法定向爬取股票相關資訊,並儲存在資料庫中。
1.爬取股票資訊(採用抓包方式)(作業2)
本作業原始碼連結:https://gitee.com/huang-yuejia/DataMining_project/blob/master/work2/2.2
-
結果展示:
爬取過程
儲存到資料庫
-
關鍵程式碼展示:
提取json格式資料
# 提取 JSON 資料
json_str_start = response.text.index('(') + 1 # 找到 '(' 的位置
json_str_end = response.text.rindex(')') # 找到 ')' 的位置
json_str = response.text[json_str_start:json_str_end] # 提取 JSON 字串
# 解析 JSON 資料
data = json.loads(json_str)
# 檢查資料是否成功讀取
if 'data' in data and 'diff' in data['data']:
return data['data']['diff']
else:
print("資料格式不正確或未找到 'diff' 欄位。")
return []
透過f1,f2等引數獲取資訊
if stock_data:
# 提取所需欄位並準備資料插入
stocks = []
for stock in stock_data:
stock_code = stock.get('f12') # 股票程式碼
stock_name = stock.get('f14') # 股票名稱
stock_price = stock.get('f2') # 當前價格
stock_change = stock.get('f4') # 漲跌
stock_trading_volume = stock.get('f5') #交易量
stock_transaction = stock.get('f6') #總交易金額
stock_change_percent = stock.get('f10') # 漲跌幅度
2.心得體會
- 加深了對API資料抓取、JSON 解析、SQLite 資料庫操作以及 Python 程式設計中模組化設計的理解。
作業③:
- 要求:爬取中國大學 2021 主榜(https://www.shanghairanking.cn/rankings/bcur/2021)所有院校資訊,並儲存在資料庫中,同時將瀏覽器 F12 除錯分析的過程錄製 Gif 加入至部落格中
本作業原始碼連結:https://gitee.com/huang-yuejia/DataMining_project/blob/master/work2/2.3
1.爬取大學排名-抓包方式(作業3)
- 結果展示:
瀏覽器 F12 除錯分析的過程錄製
爬取過程
儲存到資料庫
- 關鍵程式碼展示:
將地址資料由英文字元表示轉換為中文(查閱資料修改)
#獲取需要的資料
name = re.findall(',univNameCn:"(.*?)",', university_data)
score = re.findall(',score:(.*?),', university_data)
category = re.findall(',univCategory:(.*?),', university_data)
province = re.findall(',province:(.*?),', university_data)
#對資料進行處理變換
code_name = re.findall('function(.*?){', university_data)
start_code = code_name[0].find('a')
end_code = code_name[0].find('pE')
code_name = code_name[0][start_code:end_code].split(',')
value_name = re.findall('mutations:(.*?);', university_data)
start_value = value_name[0].find('(')
end_value = value_name[0].find(')')
value_name = value_name[0][start_value + 1:end_value].split(",")
universities = []
for i in range(len(name)):
#將實際資訊存入
province_name = value_name[code_name.index(province[i])][1:-1]
category_name = value_name[code_name.index(category[i])][1:-1]
print((i + 1, name[i], province_name, category_name, score[i]))
universities.append((i + 1, name[i], province_name, category_name, score[i]))
2.心得體會
*部分資訊不是直接將資料儲存在其中,而是先透過其他更簡介的方式標記,需要時再透過函式轉化得到。例如本次作業中的學校地址,型別資訊。透過這種方式,可以減少資料的傳輸量,儲存量,提高效率。
二、作業總結
難點與挑戰:
- 複雜的網頁結構與資料抓取
網頁中的資料經常被深藏在巢狀的標籤或指令碼中,尤其是學校排名和股票資訊,需要分析網頁的 DOM 結構,或者透過抓包分析找到資料來源。提取資訊時,需要精確選擇合適的標籤或使用正規表示式來解析非結構化的資料。 - API 資料解析
對於股票資訊,資料透過 API 返回的 JSON 格式,需要準確地理解 JSON 資料的層次結構,並提取出關鍵資訊進行處理和儲存。
解決思路:
- 抓包分析
使用瀏覽器的開發者工具進行抓包分析,找出 API 請求和返回的格式,從中提取出資料的結構,設計相應的解析邏輯。 - 資料處理與清洗
在解析完 JSON 資料後,結合實際需要提取特定的欄位,使用字典或對映表將程式碼轉換為相應的文字資訊,確保資料在儲存之前已經處理完畢,滿足後續使用的需求。
新知識與收穫:
-
深入掌握 HTML 和 CSS 的解析
透過多次實踐,增強了對 HTML 文件結構的理解,能更靈活地使用 BeautifulSoup 進行資料提取。學習瞭如何使用 CSS 選擇器和 XPath 來選擇特定節點,極大提高了提取效率。 -
API 呼叫與 JSON 資料處理
對 API 資料的呼叫與 JSON 格式的解析有了更深刻的理解,掌握瞭如何從 JSON 資料中提取出巢狀欄位,並將其轉化為所需的格式。 -
資料庫的設計與操作
在使用 SQLite 進行資料儲存的過程中,理解了如何設計資料庫表結構,如何高效地進行資料插入、更新和查詢,進一步提高了資料的管理和使用效率。