資料採集作業2

布若發表於2024-10-17

| 課程連結 | |
| ---- | ---- | ---- |
| 作業連結 | |
| gitee檔案連結 | 1 |
| 學號 | 102202157 |
| 姓名 | 王黨兵 |

作業1

1.資料採集實驗
要求:在中國氣象網(http://www.weather.com.cn)給定城市集的 7日天氣預報,並儲存在資料庫。
示例程式碼

點選檢視程式碼
import requests
from bs4 import BeautifulSoup
import sqlite3
import os
# 建立資料庫連線
db_name = 'weather_forecast.db'
conn = sqlite3.connect(db_name)
c = conn.cursor()
# 建立天氣表
c.execute('''
    CREATE TABLE IF NOT EXISTS weather_forecast (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        city TEXT,
        date TEXT,
        weather TEXT,
        temp_high TEXT,
        temp_low TEXT,
        wind TEXT
    )
''')
# 爬取天氣資料的函式
def get_weather_forecast(city_code, city_name):
    url = f"http://www.weather.com.cn/weather/{city_code}.shtml"
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"}
    response = requests.get(url, headers=headers)
    response.encoding = 'utf-8'
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        # 查詢7日天氣預報資訊
        seven_day_forecast = soup.find('ul', class_="t clearfix").find_all('li')
        weather_data = []
        for day in seven_day_forecast:
            date = day.find('h1').text  # 日期
            weather = day.find('p', class_="wea").text  # 天氣情況
            temp_high = day.find('p', class_="tem").find('span').text if day.find('p', class_="tem").find(
                'span') else ''  # 最高溫度
            temp_low = day.find('p', class_="tem").find('i').text  # 最低溫度
            wind = day.find('p', class_="win").find('span')['title']  # 風力
            weather_data.append((city_name, date, weather, temp_high, temp_low, wind)
        # 插入資料到資料庫
        c.executemany('''
            INSERT INTO weather_forecast (city, date, weather, temp_high, temp_low, wind) 
            VALUES (?, ?, ?, ?, ?, ?)
        ''', weather_data)
        conn.commit()
        print(f"{city_name}的7日天氣資料已成功儲存。")
    else:
        print(f"無法獲取{city_name}的天氣資料,狀態碼: {response.status_code}")
# 你可以在這裡新增多個城市的程式碼
cities = {
    "北京": "101010100",
    "上海": "101020100",
    "廣州": "101280101",
    "深圳": "101280601"
}
# 遍歷城市並爬取天氣資料
for city_name, city_code in cities.items():
    get_weather_forecast(city_code, city_name)
# 關閉資料庫連線
conn.close()
# 確認資料庫檔案已生成
if os.path.exists(db_name):
    print(f"資料庫檔案 '{db_name}' 已成功建立。")

效果截圖

2.心得體會
1.技術挑戰與成長
在完成這個作業的過程中,我遇到了不少技術挑戰,也從中獲得了極大的成長。
從網頁爬取資料是一個全新的領域。透過使用requests庫傳送 HTTP 請求,我學會了如何與外部網站進行互動並獲取所需的資訊。同時,BeautifulSoup庫的運用讓我能夠解析複雜的 HTML 頁面結構,精準地提取出 7 日天氣預報的關鍵資料,如日期、天氣情況、溫度和風力等。這個過程鍛鍊了我的資料提取和處理能力,讓我更加熟悉網頁結構和資料抓取的技巧。
資料庫操作也是一個重要的環節。使用sqlite3庫建立資料庫和表,並將爬取到的天氣資料儲存其中,讓我深入瞭解了資料庫的設計和操作。從建立表結構到執行插入語句,每一個步驟都需要仔細考慮資料的完整性和準確性。透過這個作業,我不僅掌握了基本的資料庫操作技能,還學會了如何有效地管理和儲存資料。
2.問題解決與思考
在作業過程中,也遇到了一些問題,這些問題促使我進行深入的思考和探索。
例如,在爬取網頁資料時,可能會遇到網路連線不穩定、頁面結構變化或者反爬機制等問題。為了解決這些問題,我需要不斷地調整程式碼,新增錯誤處理機制,以確保程式的穩定性和可靠性。同時,在資料庫操作中,也可能會出現插入資料失敗、資料重複等問題,這需要我仔細檢查 SQL 語句的正確性,並考慮資料的唯一性和完整性。
透過解決這些問題,我學會了如何分析問題、尋找解決方案,並在實踐中不斷最佳化程式碼。這種問題解決的能力將對我今後的學習和工作產生積極的影響。

作業2

1.資料採集實驗
要求:用 requests 和 BeautifulSoup 庫方法定向爬取股票相關資訊,並儲存在資料庫中。
候選網站:東方財富網:https://www.eastmoney.com/ 新浪股票:http://finance.sina.com.cn/stock/
示例程式碼

點選檢視程式碼
import requests
import sqlite3
import json
import os
# 建立資料庫連線
db_name = 'stock_data.db'
conn = sqlite3.connect(db_name)
c = conn.cursor()
# 建立股票資料表
c.execute('''
    CREATE TABLE IF NOT EXISTS stock_data (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        stock_code TEXT,
        stock_name TEXT,
        current_price REAL,
        change_percent REAL,
        change_amount REAL
    )
''')
# 東方財富網的股票資料API
url = "http://push2.eastmoney.com/api/qt/clist/get"
params = {
    "pn": "1",  # 頁數
    "pz": "20",  # 每頁顯示股票數目
    "po": "1",
    "np": "1",
    "ut": "bd1d9ddb04089700cf9c27f6f7426281",
    "fltt": "2",
    "invt": "2",
    "fid": "f3",
    "fs": "m:0+t:6",  # 市場和類別
    "fields": "f1,f2,f3,f4,f12,f14"
}
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
}
# 傳送請求並獲取響應
response = requests.get(url, params=params, headers=headers)
data = response.json()
# 解析返回的JSON資料
if data and data['data']:
    stock_list = data['data']['diff']
    # 準備插入的資料
    stock_data = []
    for stock in stock_list:
        stock_code = stock['f12']  # 股票程式碼
        stock_name = stock['f14']  # 股票名稱
        current_price = stock['f2']  # 當前價格
        change_percent = stock['f3']  # 漲跌幅
        change_amount = stock['f4']  # 漲跌額
        stock_data.append((stock_code, stock_name, current_price, change_percent, change_amount))
    # 插入資料到資料庫
    c.executemany('''
        INSERT INTO stock_data (stock_code, stock_name, current_price, change_percent, change_amount) 
        VALUES (?, ?, ?, ?, ?)
    ''', stock_data)
    conn.commit()
    print("股票資料已成功儲存到資料庫。")
# 關閉資料庫連線
conn.close()
# 確認資料庫檔案已生成
if os.path.exists(db_name):
    print(f"資料庫檔案 '{db_name}' 已成功建立。")

效果截圖

2.心得體會
1.技術探索與挑戰
在這個任務中,我深入探索了網頁爬取和資料儲存的技術領域。選擇使用requests和BeautifulSoup庫進行股票資訊的定向爬取,既充滿了挑戰,也帶來了許多收穫。
透過谷歌瀏覽器的 F12 除錯模式進行抓包是關鍵的一步。在這個過程中,我需要仔細分析股票列表載入所使用的 URL 以及 API 返回的值。這要求我對網路請求和響應有更深入的理解,學會解讀各種引數的含義和作用。例如,根據 URL 中引數f1和f2的不同取值,可以獲取不同的股票資訊,這需要我根據實際需求進行適當的調整和刪減請求引數。這個過程鍛鍊了我的資料分析和問題解決能力。
2.BeautifulSoup 的強大之處
BeautifulSoup庫在解析 HTML 頁面方面表現出了強大的功能。它能夠輕鬆地從複雜的網頁結構中提取出所需的股票資訊。透過選擇合適的標籤和屬性,我可以準確地定位到股票程式碼、名稱、價格等關鍵資料。這個過程讓我更加熟悉 HTML 結構和 CSS 選擇器的使用,提高了我的資料提取技巧。
3.資料庫儲存的重要性
將爬取到的股票資訊儲存在資料庫中,為資料的管理和後續分析提供了便利。透過使用sqlite3庫,我能夠建立資料庫表,並將提取的股票資料插入其中。這不僅保證了資料的永續性,還方便了後續的查詢和分析操作。同時,我也學會了如何設計合理的資料庫表結構,以確保資料的完整性和一致性。
4.問題解決與最佳化
在爬取過程中,我遇到了一些問題,如網路連線不穩定、頁面結構變化等。為了解決這些問題,我採取了多種措施。例如,新增錯誤處理機制,以應對網路請求失敗的情況;定期檢查頁面結構的變化,及時調整資料提取的方法。此外,我還考慮了效能最佳化的問題,如合理設定請求間隔,避免對目標網站造成過大的負擔。

作業3

1.資料採集實驗
要求:爬取中國大學 2021 主榜(https://www.shanghairanking.cn/rankings/bcur/2021)所有院校資訊,並儲存在資料庫中,同時將瀏覽器 F12 除錯分析的過程錄製 Gif 加入至部落格中。
示例程式碼

點選檢視程式碼
import requests
import re
import sqlite3
class DB:
    #建立空的schoolrank.db
    def open(self):
        self.connection=sqlite3.Connection('school.db')
        self.cursor=self.connection.cursor()
        try:
            self.cursor.execute(
                'create table schoolrank(排行 Integer primary key autoincrement,學校 vachar(16),省市 vachar(16),型別 vachar(16),總分 real)'
            )
        except:
            self.cursor.execute('delete from schoolrank')
    #關閉weather.db
    def close(self):
        self.connection.commit()
        self.cursor.close()
    #插入資料
    def insert(self,name,province,cata,score):
        self.cursor.execute(
            'insert into schoolrank(學校,省市,型別,總分) values(?,?,?,?)',(name,province,cata,score)
        )
url=r'https://www.shanghairanking.cn/_nuxt/static/1728872418/rankings/bcur/2021/payload.js'
req=requests.get(url)
req.raise_for_status()
req.encoding=req.apparent_encoding
data=req.text
func_data_key=data[len('__NUXT_JSONP__("/rankings/bcur/2021", (function('):data.find(')')].split(',')
print(data)
#正則獲取univerCn,province,univerCategory,score
univerCnlist=re.findall('univNameCn:"(.*?)",',data)
provincelist=re.findall('province:(.*?),',data)
univerCategorylist=re.findall('univCategory:(.*?),',data)
scorelist=re.findall('score:(.*?),',data)
print(univerCnlist)
print(len(univerCnlist))

#獲取func_data_value為[vlaue,value,....]
func_data_value=data[data.rfind('(')+1:-4].split(',')
#將二者配對
cnt=0
mydict={}
for key in func_data_key:
    value=func_data_value[cnt]
    mydict[key]=value
    cnt+=1
#提取其中有用的資訊
name=univerCnlist
province=[]
for item in provincelist:
    province.append(mydict[item])
cate=[]
for item in univerCategorylist:
    cate.append(mydict[item])
print(len(univerCnlist))
print(len(province))
print(len(scorelist))
db=DB()
db.open()
for i in range(len(name)):
    db.insert(name[i],province[i],cate[i],scorelist[i])
db.close()

效果截圖

抓包截圖

2.心得體會
1.網頁爬取技能提升
透過這個任務,更加熟練地掌握了使用requests庫傳送 HTTP 請求來獲取網頁內容。學會了處理各種請求狀態碼,確保能夠準確地獲取到目標網頁的資料。同時,也瞭解到如何設定請求頭和處理編碼問題,以提高爬取的成功率和資料的準確性。
深入理解了正規表示式在網頁資料提取中的強大作用。能夠根據網頁內容的特定格式,編寫合適的正規表示式來精確地提取所需的大學資訊,如學校名稱、省份、類別和分數等。這一過程提高了對正規表示式語法和匹配規則的掌握程度。
2.資料庫操作能力增強
學會了使用sqlite3庫來建立和操作 SQLite 資料庫。能夠熟練地建立資料庫表、插入資料以及進行事務處理,確保資料的完整性和一致性。透過這個任務,對資料庫的基本操作有了更深入的理解,為以後處理更復雜的資料儲存需求打下了基礎。
3.問題解決能力鍛鍊
在任務過程中,遇到了各種問題,如資料提取不準確、資料庫插入失敗、網頁結構變化等。透過不斷地除錯和分析,學會了使用列印錯誤資訊、檢查變數值等方法來快速定位問題所在,並採取相應的解決措施。這一過程提高了問題解決的能力和應對突發情況的能力。
4.對資料價值的認識
儲存在資料庫中的大學資訊為進一步的資料分析提供了基礎。可以透過對這些資料進行統計分析,瞭解大學排名的分佈情況、不同省份的教育實力對比、各類大學的特點等。這有助於深入挖掘資料背後的價值,為教育研究和決策提供有力支援。

相關文章