資料採集與融合技術實踐課作業2

Dust4399發表於2024-10-16

資料採集與融合技術實踐課第二次作業

這個作業屬於哪個課程 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 進行資料儲存的過程中,理解了如何設計資料庫表結構,如何高效地進行資料插入、更新和查詢,進一步提高了資料的管理和使用效率。

相關文章