跳到主要內容

python網路爬蟲輕鬆取得氣候資料(2)


延續上一篇的內容,這篇就不贅述,以中央氣象局CODiS平台實際操作網路爬取氣候資料。

操作步驟:
1.了解HTML網頁語法基本編寫概念
在網頁上按F12可以瀏覽網頁原始碼,html架構由以下的基本元素組成。 
²  網頁的所有內容會包含在< html> < /html> 標籤之間
²  網頁中重要元素或定義會放在< head>< /head> 標簽之間,例如: 放置網頁標題的< title>標籤,就會放置在head裡面。
²  網頁中所呈現的內容(可視化的部份),會放於< body> < /body> 標籤之間。其中標示文章標題的標籤< h1>以及標示文章內文的標籤< p>都會放置於body標籤下。










2.查看頁面,確認可行的爬蟲方式
以中央氣象局CODiS平台為例,可能可行的方式有2種,(1)透過圖1”CSV下載的方式直接下載CSV檔案 (2)爬取該網頁報表上的數值,再由程式轉換成檔案。

方式1:
html原始碼中找到對應”CSV下載標示的編碼(如下圖12)。這邊的編碼還另外包含了CSS的編碼,CSS為在html主架構下細部內容之編寫。在< a id=”downloadCSV” herf=”#”>這段內容中,herf後面接超聯結的路徑,但是這個網頁編碼後面接的是#而不是個路徑,這個#代表為前面的id,而id的屬性則在html中另外編輯屬性套用。所以看要再回去查看# downloadCSV那部份的程式編寫。不過查看後發現如果要透過路徑連結批量下載CSV檔的途徑似乎不可行,這部份讀者也可以自己再去確認看看。

1









2

網站管理員為了避免資料這麼容易被取得,所以將程式撰寫較為複雜,增加取得難度的情況相當常見,所以大家在爬蟲的時候不要一些挫折就氣餒。

方式2:
方式1的方法既然不可行,那就採用方式2,爬取整個頁面的表格數據,再整理CSV成檔案。這邊會用到3個套件,開始執行前,尚未安裝requestsBeautifulSoupcsv者需要先安裝,在Window環境下,開起命令提示字元,輸入pip install requests pip install bs4以及pip install csv,安裝完成後,後續以方式2的方式進行說明。
3.採用方法2,嘗試取得html解碼後標簽字串的回應內容

  1. import requests
  2. r=requests.get("http://e-service.cwb.gov.tw/HistoryDataQuery/MonthDataController.do?command=viewMain&station=466910&stname=%25E9%259E%258D%25E9%2583%25A8&datepicker=2019-08")
  3. print(r.text)

3

執行結果(3)大家可以看到,requests的請求取得整個網頁的資訊,大家可以在往下看到編寫網頁表格的部份,裡面有當月每日的氣候資料,截取部份資料如圖4,只是這樣的形式,我們無法直接利用,必須再處理成表格的樣式。

4


4.取出網站表格資料,寫入CSV檔案
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import csv
  4.  
  5. url="http://e-service.cwb.gov.tw/HistoryDataQuery/MonthDataController.do?command=viewMain&station=466910&stname=%25E9%259E%258D%25E9%2583%25A8&datepicker=2019-08" #網址
  6. csvfile="test.csv" #開個csv檔案準備寫入
  7. r=requests.get(url)
  8. r.encoding="utf-8"
  9. soup=BeautifulSoup(r.text,"lxml")
  10. tag_table=soup.find(id="MyTable") #用BeautifulSoup找到table位置
  11. rows=tag_table.findAll("tr") #找到每個
  12.  
  13. with open(csvfile,"w+",newline="",encoding="utf-8") as fp:
  14. writer=csv.writer(fp)
  15. for row in rows:
  16. rowList=[]
  17. for cell in row.findAll(["td","th"]):
  18. rowList.append(cell.get_text().replace("\n","").replace("\r",""))
  19. writer.writerow(rowList)

利用BeautifulSoup套件中的find()函數找到最一開始
的標籤(5),再用findAll找出表格中每列 的標籤。再開啟csv檔,用迴圈的方式搭配findAll,讀取每一列有細格的標籤,再用get_text()函數從cell取得數值,再利用append()函數將數值合併上去。最後再將每一列的數值寫到rowList中最後存到一開始創建的csv檔案中(test.csv)
5

5.批次讀取
剛剛的執行只是完成一個頁面的爬蟲,再上一篇文章中,我們已經粗略估算過需要下載6萬個檔案。所以到這邊,不知道大家是否有注意到,網站上的網址有個規律性,不管換什麼樣的時間、什麼測站,網址會變動的只有標住顏色的部份。所以利用這個特性,寫迴圈置換會變動的部份,然後重覆執行剛剛那段程式,不管是要下載特定測站的資料或是限定特定期間的資料,透過網路爬蟲,都可以輕鬆取得。
http://e-service.cwb.gov.tw/HistoryDataQuery/MonthDataController.do?command=viewMain&station=466910&stname=%25E9%259E%258D%25E9%2583%25A8&datepicker=2019-08

留言

張貼留言

這個網誌中的熱門文章

如何快速註冊統合分析題目~以PROSPERO為例

初步檢索心中的愛 當心目中有一個理想題目時,為避免地球上另一個人也同時跟你想的一樣,而且還比我們早發表,若等我們發表時才發現,當下一定很扼腕,有了註冊系統除了幫自己先占好位子,也可以同時確認這個題目是否已經有人正在做了,不用浪費時間投注在上面。很多人其實不曉得實際上到底要如何註冊,以下一起註冊吧。 什麼是 PROSPERO??   PROSPERO (International prospective register of systematic reviews) 是一個國際前瞻性系統性文獻回顧評價系統,由美國國立衛生研究院 NIHR ( National Institute for Health Research )資助,由英國約克大學 CRD(Centre of Reviews and Dissemination) 創立,針對將已完成的評價或正進行中的計畫做紀錄。 目的:避免重複並減少報告偏見的機會,增加透明性。                 步驟流程 Step 1 :檢索主題 先確認其他人是否對這主題感興趣,有人捷足先登了嗎 ?? 也可以確認目前流行的趨勢是哪類型的研究等。 Step 2 :註冊帳號 ID 先到 PROSPERO 官網 ,填寫基本資料後註冊 ID 。 Step 3 :點選註冊文獻 review 要需先有帳號後才能註冊題目,進入頁面後依指示一步一步操作。 以下是網頁步驟,依研究對象是人群還是動物選擇按鈕點選,一般我們都是人群研究,選紫色。同時須確認以下五步驟是否都經過檢驗了。 第 1 步 檢查納入標準。 第 2 步 確保您的 protocol 處於(接近)最終形式。 第 3 步 搜尋 PROSPERO ,以確保評論尚未被註冊。 第 4 步 搜尋 PROSPERO ,以確保您沒有不必要地重複由另一個團隊進行的審核或先前已註冊的審核 第 5 步 開始註冊 Step 4 :點選相關事前準備工作進度。 這裡有一系列問題須皆回答完,才能進行下一步...

python與SAS資料處理-歸人與排除重複

  歸人顧名思義就是將一個人多筆的資料整合,每人只留下 1 筆。   通常取得的資料都是原始資料,並未經過整理。例如手上有疑份顧客購物紀錄,裡面有每個顧客在這 1 年內的每筆消費紀錄,這是一份以每次消費紀錄為 1 筆的紀錄形式,所以一個人可以有多筆的消費紀錄。當我們想要知道這些消費紀錄源自於多少顧客的購買時,這時候就需要用到歸人的概念,將資料轉換為每一個人只有 1 筆資料的紀錄形式 ( 如下圖所示 ) 。 以 SAS 進行資料歸人 歸人留 1 筆消費紀錄 proc sort data =cost; by ID time; run ; /* 在規筆前依照 ID 跟消費日期做排序 */ data cost_1; set cost; by ID; if first.id; run ;   /* 保留第一筆資料 */   之前已經有針對 proc sort 的排序語法進行說明,有需要可參考這篇 文章 , SAS 排序的設定值為升冪,也就是說每個人都會從最早那次的紀錄開始往後排序,所以用 first.id 就可以留下每個人最早那次的消費紀錄。 這邊也可以用排除重複的概念保留 1 筆資料 proc sort data =cost out =cost_2 nodupkey ; BY ID; run ; 利用 nodupkey ,將 ID 重複的資料刪除,僅保留每個 ID 第一次出現的該筆紀錄。   歸人累計所有消費金額 proc sort data =cost; by ID time; run ; data cost_1; set cost; by ID; if first.id then count= 0 ;/* 每個人第一筆資料都令 count=0*/ count+NT;/* 同 ID 累計 NT 數值 */ if last.id; run ;   除了要歸人以外,還要累計每個仁所有的消費金額,所以這邊就會創建一個 count 欄位,每一個人的第一筆 ID 令 count=0 ,在同樣 ID 時累加 NT 的數值,最後每個人保留最後一筆 ID ,也就是最後累計的總額。 以 Python 進行資料歸人...

python與SAS資料處理入門--資料匯入匯出

為什麼要學程式語言,不能用 excel 做大型資料的處理 不建議使用 excel 做大型資料處理的原因有 2 點, (1)excel 行列的限制, 2003 年以前的版本,最大資料列筆數為 65,536 行、欄位數最多為 256 列, 2007 之後的版本雖然行列都有擴展,最大資料列筆數可達到 1,048,576, 行、欄位數最多為 16,384 列,但對於現在隨便動輒幾億筆的資料來說,這真的不算什麼,因此實務上可能會遇到一份資料得分成好幾個 sheet 儲存的情況。 (2) 資料量太大,可能會遇到 excel 執行上耗時的問題。 對於即將跨入大數據的人而言, SPSS 雖然也是個不錯的選項,具有操作簡單之優勢,短期內可快速掌握,但也因介面以選單式操作為主,使用彈性相對受限,此外對於大數據處理效率也較差,如果 未來工作上需經常面對大數據 ( 例如 : 醫學資料庫、商業資料庫 ) ,建議可以直接選擇學習 SAS 、 R 或是 Python 。 以下就挑選 SAS( 付費軟體 ) 以及近年很熱門的 Python( 開源軟體 ) ,從基本的資料匯入、匯出開始介紹起。不論 SAS 或是 Python 皆可以匯入許多不同類型的檔案格式,本文就挑選幾個可能比較常接觸到的類型做說明。 以 SAS 進行操作 介面 執行 SAS 會經常使用到的視窗有幾個部分,以下簡述其用途 : (1) 編輯器:指令輸入,未來相關語法的編輯都在該視窗完成。 (2) 日誌:顯示指令執行結果,如果有程式上的執行錯誤,皆顯示於該視窗。 (3) 結果:分析結果的索引,方便使用者管理結果的部分。 (4) 檔案總管:資料集的管理,可於此處點選瀏覽資料內容。 資料匯入 (proc import) ²      Excel 檔案匯入 proc import datafile = "c:\test.xlsx" /* 資料匯入的路徑 */ out =test  /* 資料匯入後的名稱 */ dbms =xlsx replace; /* 輸入檔案的類型 */ sheet = " Sheet" ; /* 選擇讀取的工作表 */ getnames =YES; /* 第一...