2015/9/17

簡單好用的 web scraping R 套件 - rvest

近年來很流行網路爬蟲技術,可以自行捉取自己想要的資訊; 只要不是太複雜的網站,使用 R 底下的套件 httr 就可以捉取了;不過由於 httr 並沒有直接支援 CSS 與 xpath 選取,所以還要額外安裝其他的套件來輔助解析網頁資訊。

最近發現到 rvest 這個套件,直接支援 ccs 與 xptah 選取,安裝 rvest 後,在啟用 rvest 時也會順道加入支援 pipeline 編寫,可以有效避免恐怖的巢狀地獄…
rvest 使用如同一般網路爬蟲技術,流程如下所示:
  • 要捉的網頁真實的網址是什麼 --url = ???
  • 把網頁捉下來 --html( )
  • 解析(parse)網頁,選取所需內容(使用 CSS 或 XPATH ) --html_nodes()
  • 過濾掉其他雜質 -- 此例中我們只留下純文字就好 不留下超連結 html_text()
因為蘋果日報最近的全幅廣告真的很討人厭 > <" ,以下就以自由時報的即時總覽的第一頁進行說明 網址如下: http://news.ltn.com.tw/list/BreakingNews

首先我們可以使用 chrome 中的開發者工具 或是 Firefox 中的 Firebug 來協助我們進行選取,可以發現用以下的語法就能正確捉取我們所要的資料…
  • css 選取語法 .picword
  • xpath 選取語法 //*[@id='newslistul']/li/a
接著就幾乎等於完成了,沒錯這就是最簡單的一隻網路爬蟲 :)
此處以 css選取(html_nodes函數)舉例,並將資料存成 dataframe 格式,以利串接至資料庫中:
 
library(rvest)

 news_url="http://news.ltn.com.tw/list/BreakingNews"

title_css = html(news_url) %>% html_nodes(".picword") %>% html_text()

my_news = data.frame(title = title_css)

View(my_news)

然後你就會有2個重大的發現:
(1)網路爬蟲的入門也蠻簡單的啊~~
(2)即時新聞大部份都不是很重要~~

備註1:使用 xpath 選取
將html_nodes(".picword")以html_nodes( xpath = "//*[@id='newslistul']/li/a")取代即可

備註2: 想要取捉每篇即時新聞的網址,以利後續捉取內文的話呢??
my_news =
data.frame(
title = html(news_url) %>% html_nodes(".picword") %>% html_text()  , 
title_href = html(news_url) %>% html_nodes(".picword") %>% html_attr( "href")  ,
stringsAsFactors=FALSE)  

備註3: 套件作者 Github https://github.com/hadley/rvest

2014/9/23

[筆記]R 與 Python 連接 MySQL 資料庫

[筆記]R 與 Python 連接 MySQL 資料庫方式

作業環境:Mac OSX
資料庫:本機 / 資料庫名稱 = a777
因為我個人對於 SQL 還蠻熟悉的,所以一些初步資料整理的工作我都會傾向在資料匯入時就完成,所以我很喜歡在 R 與 Python 中直接使用 SQL ,好處也是如果以後換轉到不同平台時,SQL 這個產業標準還能延用下去


R 連接  MySQL 資料庫

(1)安裝 RJDBC RMYSQL 套件
在Linux體系下安裝 RODBC 比較麻煩點,RJDBC 會省事很多

(2)語法範例程序:連接資料庫→取得資料→關閉連線→檢視資料

library(RJDBC)
library(RMySQL)

#定義連線字串
conn <- dbConnect(MySQL(), dbname = "a777", username="root", password="")

#將SQL查詢後的資料置於 data,資料型別為 data.frame
data = dbGetQuery(conn, "select * from MINING_BASE")

#關閉資料庫連線
dbDisconnect(conn)

head(data)
#進行資料初步檢視


python 連接  MySQL 資料庫

(1)安裝 MySQLdb pandas 套件
pandas 不是連接 MYSQL 的必要套件,但因為資料取得後也是要進行相關統計分析
所以也直接引用,pandas可以視為python中主要處理統計相關議題的重要套件

(2)語法範例程序:連接資料庫→取得資料→關閉連線→檢視資料

import MySQLdb
import pandas as pd
from pandas.io.sql import read_sql

# frame_query 是舊方法,pandas 建議大家改用新的 read_sql
# 引用 MySQLdb 用以連接 MySQL資料庫

#定義連線字串
mysql_cn= MySQLdb.connect(host='127.0.0.1',
                port=3306,user='root', passwd='',
                db='a777')

#將SQL查詢後的資料置於 data,資料型別為 pandas.core.frame.DataFrame
# rad_sql( "SQL語法"  , 連線字串)

data = read_sql("select * from MINING_BASE   "  , mysql_cn  )

mysql_cn.close()
#關閉資料連線

data.head()
#進行資料初步檢視

參考資料:
http://www.r-bloggers.com/mysql-and-r/


備註:


# Python 中還有一種方式是使用 sqlalchemy ORM
# 暫時用不到這種語法,但也做為一個補充放上來
# 參考網址   http://docs.sqlalchemy.org/en/rel_0_9/orm/
# 中文教學網址  http://chimerhapsody.blogspot.tw/2013/08/python-sqlalchemy-orm-part-1.html


import sqlalchemy
import csv
engine = sqlalchemy.create_engine('mysql://root@localhost/a777')
connection = engine.connect()
result = connection.execute("select MINING_DW_SUBSCR_NO from MINING_BASE")
row = result.fetchone()
#for row in result:
 #   print "your data in here ", row['MINING_DW_SUBSCR_NO']

fh = open('data77777.csv', 'wb')

outcsv = csv.writer(fh)
outcsv.writerow(result.keys())
outcsv.writerows(result)

fh.close
connection.close()


愈來愈討厭 big data 的字眼

愈來愈討厭 big data 的字眼

雖然本部落叫做 moe big data,目前看來好像是用來騙流量的…

主要的理由是目前有太多不切實際的理想都被歸入 big data

好處當然是相關領域會有大批的人力物力財力予以投入
但是缺點就變成什麼東西都是 big data,在討論事情的時候就變成雞同鴨講

好比最怕碰到一種人「不要和我談政治」,但是當你聽到他這樣說的時候,其實大部份的時候是很難理解他說的是「不要批判某一特定政黨」「不要批判某一候選人」「公司同事之間的相處之道」;因為廣義的來說,只要有人際關係、有利害,小則家庭可以有政治,中則公司有政治,範圍更廣的則有國家體制內的政治、國際政治,你說不要談是在講什麼哩

所以我轉念一想
也許本部落來談談一些基本 big data 下較為具體的技術與理論好了
畢竟太虛幻太美麗的事物,終究是鏡花水月…



Sublime text - 設定 SublimeREPL

目前使用 sublime text 3做為預設文字處理編輯器
主要使用的語言為 python 與 R


sublime text 預設支援 python 環境,只要設定[Tools]-->[Build system]-->[Python]
在編輯 python 的同時只要按下 cmd+b 就可以看到python檔案執行結果,
不過還是有些限制,所以需要單純的python作業環境

要達成這個目的最基本的就是安裝sublimeREPL 套件
(REPL指的是read-evaluation-print-loop)
簡單的想成就是在編輯器上面就直接可以執行 Python 與 R)

sublimeREPL相關設定如下:

(1)事先裝好 package control 這個套件
(2)安裝 sublimeREPL
(3)設定 user 使用檔
    sublime text 的使用邏輯是你先到預設檔案複製相關設定值到user設定,避免後續你反悔了想要改回預設值時找不到檔案(不過其實大部份的套件在github都直接找得到預設值)

我使用的環境是 mac osx,比較重要的設定如下提供參考:

    "default_extend_env":  {"PATH": "/Users/帳號/anaconda/bin:/Users/帳號/anaconda/bin:/Users/帳號/anaconda/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin"},

(4)切換檢視方式
[view] --> [Layout] --> [Col2] (我是選2欄的版面)

(5)叫出Python作業環境
個人習慣使用 ipython
    方法1:[Tools] --> [SublimeREPL] --> [Python] -->[IPYTHON]
    方法2:快速鍵 shift+cmd+p ,輸入 reip
    (因為sublime有支援 fuzzy 蒐尋所以可以省略部分英文字母)

結果如下:
左側是 python 文件編輯區
右側是 iptyhon作業環境  (iptyhon的左則 tab是 R 的作業環境)
下側是 python 執行結果






2014/7/2

我認為的資料科學家作業流程

之前有幾次機會到不同場合分享 Excel 在實務上應用,不過當時的標題大致上都是「樞紐分析」「資料分析」,感覺上就是不夠大器。
上網找了一下,原來當年針對 Data Mining 這個主題就有人提出了的作業流程:CRIPS-DM
我覺得定義的還蠻完整的,也符合實務上遇到的狀況,更重要的是它將Business Understanding 與 Deployment 也納入,就是要提醒玩弄資料的工程師,千萬不要只將眼界完全專注在單一課題(例如:新演算法的開發),而是要對實際商業環境做出價值。好比你是個管理顧問,接到了個賣牛肉麵的案子,那設法將牛肉麵多賣出個幾千碗就是你的價值所在;總不能資料分析到最後:成年男性牛肉麵吃的比較多
File:CRISP-DM Process Diagram.png

上圖引用自 wikipedia
可以看到主要分為6大階段

Business Understanding
Data Understanding
Data Preparation
Modeling
Evaluation
Deployment
我自己的記憶理解方式如下:
以某校新到任教師為例,各階段對應狀況如下:
(1)Business Understanding
學生們的學習狀況為何? 要做些什麼來協助提高低學習意願學生的動機?
(2)Data Understanding
蒐集那些資料可以協助瞭解這個問題? 筆試成績、家長背景、學生姓別、年齡、居住地、國籍、經濟狀況 ?
資料想要蒐集得愈多,成本會愈高哦

(3)Data Preparation
蒐集資料的過程中,有些資料可以直接計算得到。例如:只要知道出生年月日,自然可推算年齡;
但同樣填寫小康,有人是住在大安精華區,有人是在荒山野嶺...是否有其他方式提供資料的正確性?
(4)Modeling
決定要採用那些分析技術→繪製直方圖、敘述統計、差異分析、學習狀況分類
(5)Evaluation
評估→此例中只是一個教師想要執行的專案,以目前電腦的計算能力,不太有評估的需要...但如果是整個國家的資料,則選用的分析模型是否合宜就楚重要
(6)Deployment
因材施教? 改變教室經營方式? 改變家長心態? 改變筆試頻率?
我想在教育機構,重視的應該是第(4)項:Modeling;
所謂的統計學、計算機概論、機器學習、程式寫作,都可以視為是這塊...
不過其實在實務上,有些項目還真的不好畫分
比方說在 Big Data 時代,很多資料並不像是當年在喊 Data Mining 時資料是由廠商自行蒐集而來的結構化資料,現在有很多資料是屬於非結性構資料;所以說啦,Big Data是個強調混搭的時代
只要有心的話,廠商也可以設定一個 Facebook 粉絲頁;或是廠商可以利用程式監控敵對企業專利申請的狀況...再簡單一點,賣冰啤酒的廠商可以取得氣象預報的各項資料來研擬各種行銷策略
我把以上的流程,再和The input-process-output (IPO) model 結合如下:
Moe
資料科學家作業流程
CRIPS-DM IPO 對應技術分類
(個人意見)
Ⅰ-定義問題 Business Understanding Input 產業分析
商業知識/邏輯
Ⅱ-取得資料 Data Preparation + Data Preparation Input Databse System
Information retrieval systems
Ⅲ-模型分析 Modeling + Evaluation Process 統計學
機器學習
Social Network Anaysis
Ⅳ-行動應對 Deployment Output Visualization

這樣的畫分一定有很多爭議…
好比 Social Network Anaysis 中也會有大量的Visualization(視覺化)技術啊…不過我想在學習的過程中,這對於方向感的建立是相同重要的,所以我還是會將視覺化技術給獨立化出來。而實務上的確也會有那種面對複雜的問題,無法判斷各種指標的權重應該如何決定時,將所有資訊轉化成一張圖形就決定的狀況發生…
如果本網站是一本書的話,那我想這篇文章的重要性就如何目錄吧 微笑
備註:
資料科學家(data scientis)是 Big data 炒得火熱之後出來的新名詞;
最簡單的定義就是,資料科學家的統計學比程式工程師好,資料科學家的程式能力比統計學家好…