甲、 由於環保署提供之基本資料較為詳細,如下圖所示,因此,首先篩選列管類別為水汙染之公司,藉由管制編號視為key值,將環保局內部資料之流域別進行join整合,賦予每一家管制公司排放汙水之流域別,並進行地址對位geocoding。
乙、我們設計以局處整體的角度思考設計三個頁面,瞭解局處內部之裁處情形以及各公司裁處狀況。
i. 各事業別TOP5裁罰公司
以各科室之管制事業進行統計,計算出該時間點發生裁處事實之前五名公司,藉此督促相關單位進行監督。
ii. 各公司裁處情形類型分析
同一間公司當發生水汙然時亦有可能同時伴隨空氣汙染,此介面希望關聯各科室間的橫向溝通,當一單位發生空氣汙染時,可立即協調另一單位進行訪視。
iii. 財罰與營運資訊揭露
與外部網站整合取得各公司當季稅純益資訊,希望藉由此數據瞭解裁罰金額與利潤之關係,部分企業對於裁罰情形不痛不癢,藉由此部分希望省思裁罰金額與企業責任之道德觀。
丙、 水汙染為本專案之重點,由於不同河川有其所屬流域和管制範圍,河川水體本身亦有不同等級,因此對於每一個管制流域探討其常發生裁處之公司事業類別,以及裁處事實之時間分析和河川水質情形,一共設計三種頁面,其中河川水質情形可有不同的水質檢測項目進行探討。
i. 水汙染裁罰案件與事業別分析
依據公司坐落位置和水汙染排放之流域進行分析,以視覺化方式呈現不同流域常發生裁罰事實之事業別和座落位置,以強化稽查效率。
ii. 水汙染裁罰案件與時間分析
以視覺化方式呈現各流域在不同時間點之裁處數據和月份分析,將稽查重點放在過去常發生之裁處地區和月份,提升稽查人員之效率。
iii. 裁罰案件與水質分析
由於不同流域之河川水體等級不同,以及流域中對於水汙染排放後指數之敏感度不同,因此,此頁面以地圖搭配監測點的方式呈現,由內部具有水質高度敏感度之人員,藉由水質波動數據觀察是否有裁處的情形,從上中下游數據之觀察,以及不同流域常發生裁處事實之事業別應該觀測那些水質數據。
library(RODBC)
library(httr)
regexp <- function(pattern, data, idx=1L, is.split=FALSE, spt=NULL) {
text <- data[idx]
v <- regexpr(pattern, text)
n <- unlist(lapply(strsplit(pattern, "\\.\\+"), nchar))
out <- substr(text, v + n[1], v + attr(v,"match.length") - (n[2]+1))
if (is.split) unlist(strsplit(out, spt)) else out
} # end regexp()
## 組出爬網URL
url_front <- "https://thaubing.gcaa.org.tw/envmap?facility_name=&corp_id=&industry_name=All&poltype=All&factory_fine=1&id_2=All&page=0&qt-front_content=1&facility_name="
url_end <- "&corp_id=&industry_name=All&poltype=All&factory_fine=1&id_2=All"
get_url <- paste0(url_front, "峻源股份有限公司", url_end)
## 至透明足跡爬取資料=>先取得該公司在透明足跡網址
html <- GET(get_url)
web_content <- content(html, "text", encoding = "UTF-8")
target_path <- regexp(paste0('<div class=\"views-field views-field-facility-name factory-name\"><span class=\"field-content\"><a href=\".+\">', "峻源股份有限公司", '</a>'), web_content)
print(target_path)
## [1] "/facility/J5604458"
dns <- "https://thaubing.gcaa.org.tw"
target_url <- paste0(dns, target_path)
## 開始針對目標公司爬取資料
tmp <- read_html(target_url, encoding = "UTF-8")
web_content <- tmp %>% html_nodes('.views-field-corp-id')
corp_id <- web_content %>% html_nodes('a') %>% html_text()
web_content <- tmp %>% html_nodes('.views-field-facility-name')
corp_name <- web_content %>% html_nodes('.field-content') %>% html_text()
web_content <- tmp %>% html_nodes('.views-field-facility-address')
address <- web_content %>% html_nodes('.field-content') %>% html_text()
web_content <- tmp %>% html_nodes('.views-field-industry-area-name')
industry_area <- web_content %>% html_nodes('.field-content') %>% html_text()
web_content <- tmp %>% html_nodes('.views-field-industry-name')
industry <- web_content %>% html_nodes('.field-content') %>% html_text()
web_content <- tmp %>% html_nodes('.views-field-poltype')
apply_type <- web_content %>% html_nodes('.field-content') %>% html_text()
web_content <- tmp %>% html_nodes('.views-field-updatetime')
snap_date <- web_content %>% html_nodes('.field-content') %>% html_text()
print(paste0('公司統編:', corp_id, ';公司名稱:', corp_name, ';公司地址:', address))
## [1] "公司統編:27873415;公司名稱:峻源股份有限公司;公司地址:新竹縣關西鎮南新里新城1之1、1之7號"
library(jsonlite)
URL <- paste("http://data.gcis.nat.gov.tw/od/data/api/5F64D864-61CB-4D0D-8AD9-492047CC1EA6?$format=json&$filter=Business_Accounting_NO%20eq%20", corp_id, sep="")
corp_content <- readLines(URL, encoding = "UTF-8")
## Warning in readLines(URL, encoding = "UTF-8"): 於 'http://
## data.gcis.nat.gov.tw/od/data/api/5F64D864-61CB-4D0D-8AD9-492047CC1EA6?
## $format=json&$filter=Business_Accounting_NO%20eq%2027873415' 找到不完整的最
## 後一列
df <- fromJSON(corp_content)
print(df)
## Business_Accounting_NO Company_Status_Desc Company_Name
## 1 27873415 核准設立 峻源股份有限公司
## Capital_Stock_Amount Paid_In_Capital_Amount Responsible_Name
## 1 75550000 75550000 喻O芫
## Company_Location Register_Organization_Desc
## 1 新竹縣關西鎮南新里9鄰新城1之1號 經濟部中部辦公室
## Company_Setup_Date Change_Of_Approval_Data Revoke_App_Date Case_Status
## 1 0940819 1061026
## Case_Status_Desc Sus_App_Date Sus_Beg_Date Sus_End_Date
## 1
此部分需透過Selenium套件實現,完整程式碼請參考”stock_scrawler.py”
在開始使用python爬蟲前,要先安裝好下列相關套件及WebDriver。
pip3 install selenium pandas
# for MacOS
brew install geckodriver
Selenium 為瀏覽器的自動化工具,可以自動化模擬瀏覽器進行動作,多用於直接操作瀏覽器進行自動化測試,此次藉由瀏覽器操作抓取股票網站的資料。
Pandas 為處理數據資料的套件,擅長處理一維數據及二維的表格數據, 可以直接讀取多種格式(HTML, csv, excel, json…),轉換乘DataFrame,進行資料處理。
from selenium import webdriver
import pandas as pd
driver = webdriver.Firefox() # Open the Firefox browser
driver.set_page_load_timeout(10) # Set the longest loading time for each page
# Read 公司名稱&股票代號對照表.txt
with open('./stock_list.txt', 'r') as fin:
company_code_list = fin.read().split("\n")
for company_code in company_code_list:
# Assign the URL of target page to url variable
url = "http://www.cmoney.tw/finance/f00041.aspx?s=" \
+ company_code.strip()
# Let browser GET the page
driver.get(url)
# Use css selector to get the elements whose class is "tb-out"
table = driver.find_element_by_css_selector(".tb-out")
# Use pandas to read table and convert it to DataFrame
df = pd.read_html(table.get_attribute('innerHTML'))
# Write out the DataFrame as csv file to stock_table/ folder
df[0].to_csv('stock_table/'+company_code+'.csv', index=False)
程式執行完成後,即可以在./stock_table看見如下的許多爬取資料的csv檔案 . |__1102.csv |1402.csv … |8150.csv |__8421.csv
i. 環保署基本資料提供地址資料,建議可開放內部已完成geocoding之坐標資料,並加上流域別欄位讓使用者利於辨識使用。
ii. 水質數據為每月僅監測一次且檢測時間間格為30天一次,對於意圖排放汙水之企業並無實質監控效果,且當樣本數多時,水質數據對於監測情形才有顯著幫助。
iii. 現有水質監測點以河川支流中心點與出海口為主,無法有效掌握即時廢水排放情形,未來應增加即時監控設備才有助於嚇阻企業之汙水排放。