Re: [問題] 爬蟲爬取聯合財經新聞

作者: celestialgod (天)   2016-11-25 21:27:57
※ 引述《jojojen (JJJ)》之銘言:
: [問題類型]:
: 程式諮詢
: [軟體熟悉度]:
: 入門(寫過其他程式,只是對語法不熟悉)
: [問題敘述]:
: 各位大大好,小弟算是爬蟲初學者,最近在練習爬取聯合新聞的即時新聞列表,
: 在抓出版時間時碰到一點問題,雖然硬是寫了出來,
: 但還是想請教一下有沒有更好的寫法
: 麻煩各位了!!
: [程式範例]:
: # install pack
: list.of.packages <- c("rvest", "RCurl", "stringi", "XML", "stringr")
: new.packages <- list.of.packages[!(list.of.packages %in%
: installed.packages()[,"Package"])]
: if(length(new.packages)) install.packages(new.packages)
: # 撈取財經新聞
: surl = "http://money.udn.com/money/breaknews"
: udn = read_html(surl,encoding="UTF-8")
: ranking_table = udn %>% html_nodes('.area_body') %>% html_nodes(xpath =
: "//table")
: title = ranking_table %>% html_nodes('a') %>% html_text %>% iconv(from =
: 'UTF-8', to = 'UTF-8')
: url = ranking_table %>% html_nodes('a') %>% html_attr('href')
: ## 抓取時間的時候,因為類別跟出版時間都被放在only_web class裡
: ## 我分不開只好都先抓下來,再砍掉不符合的欄位
: pattern = '^[0-9]{2}'
: t = ranking_table %>% html_nodes('.only_web') %>% html_text %>% as.data.frame
: colnames(t) = c("data")
: time = subset(t, grepl(pattern, t$data))
: [環境敘述]:
: R version 3.3.1 (2016-06-21)
: Platform: x86_64-w64-mingw32/x64 (64-bit)
: Running under: Windows 7 x64 (build 7600)
: [關鍵字]:
: 網路爬蟲, RVEST
下面是我的作法,windows用rvest會遇到encoding問題
但是windows中文版也不能正常顯示UTF8字元,所以要經過一點轉換
# require pkgs and install it if it is not installed
if (!"installr" %in% installed.packages()) install.packages("installr")
library(installr)
require2(rvest)
require2(stringi)
require2(data.table) # 轉不轉data.table無所謂
require2(pipeR)
if (is.windows()) {
original_locale <- Sys.getlocale("LC_COLLATE")
Sys.setlocale("LC_ALL", 'C')
}
surl <- "http://money.udn.com/money/breaknews"
outTbl <- read_html(surl, encoding="UTF-8") %>>%
html_node("#ranking_table") %>>% html_table
if (is.windows()) {
outTblTrans <- lapply(outTbl, function(v){
if (class(v) == "character") {
return(stri_conv(v, to = "big5")) # 字串都轉成big5
} else {
return(v)
}
}) %>>% `names<-`(NULL) %>>% as.data.table %>>% # names一定要先清空不然會錯
setnames(stri_conv(names(outTbl), to = "big5"))
Sys.setlocale(locale = original_locale)
}
# 標題 類別 出版時間 瀏覽數 分享數
# 1: 共享單車成都投放1周 亂停放被城管沒收 即時 11/25 21:21 0 NA
# 2: 緬甸洛興雅遭迫害 翁山蘇姬成眾矢之的 即時 11/25 21:21 0 NA
# 3: 馬英九:我還沒上任 就被批評會帶來大災難 即時 11/25 21:02 11 NA
# 4: 控緬甸種族淨化洛興雅人 亞洲爆示威 即時 11/25 20:54 8 NA
上面那段也可以換成下面這個做法,不過是data.table only (但是資料量大會快一點)
if (is.windows()) {
outTblTrans <- outTbl[ , lapply(.SD, stri_conv, to = "big5")] %>>%
setnames(stri_conv(names(outTbl), to = "big5"))
Encoding(names(outTblTrans)) <- "big5"
Sys.setlocale(locale = original_locale)
}
作者: lovedmagic (EricZou)   2016-12-03 17:25:00
windows7跑最後一段Sys.setcocale(locale=original_locale) 這邊還是會跑出一堆奇怪的亂碼

Links booklink

Contact Us: admin [ a t ] ucptt.com