貓版文章分析
Jessy Chen / 2019-03-22 /
貓版文章分析
動機:
重點:想要看看貓版的網友都在討論什麼樣的主題,但在整理資料的時候就發現有不少地方需要處理,尤其是有關時間資訊的部分,因此這個禮拜就把重點放在了解時間的格式。
Step 1. 利用 python 的 ptt-web-crawler package,抓取貓版近幾年的文章:
a. package 傳送門:https://github.com/jwlin/ptt-web-crawler
(感謝Sean!)
b. 下載 package 到自己的電腦。
c. 找到檔案的儲存路徑(可能會在 Documents/GitHub 資料夾之下)。
d. 在終端機輸入指令python crawler.py -b cat -i 3500 4000
(3500、4000分別為起始頁數和結束頁數)。
e. 耐心等待爬蟲完成,就可以在資料夾中看到一個 .json 檔案,檔名為 cat-3500-4000.json。
Step 2. 讀入資料:
library(rjson) # for reading .json files
library(jsonlite)
library(tidyverse) # for dealing with data frame
library(stringr) # for dealing with strings/characters
library(jiebaR) # for segmenting words
library(lubridate) # for dealing with time-related data (such as Date, POSIXct, and POSIXlt)
library(ggplot2) # for visualzation
library(DT)
先以最近兩年(2017-01-01至2018-12-31)的資料作分析。
若有機會分析更多年的資料,可以用下面的 code 來一次讀取多個檔案。
json_files <- list.files(pattern = "*.json")
json_files
data <- lapply(json_files, function(x){fromJSON(x)$articles})
Step 3. 整理 data frame:
a. 將date欄位轉成日期格式,以便篩選出近兩年的文章。 在轉換日期的過程中,遇到英文月份簡寫(如:Jun、Sep)無法顯示的問題,可能是時區造成的。
# First save your current locale
loc <- Sys.getlocale("LC_TIME")
# Set correct locale for the strings to be parsed
# (in this particular case: English)
# so that weekdays (e.g. "Thu"") and abbreviated month (e.g. "Nov"") are recognized
Sys.setlocale("LC_TIME","C")
#> [1] "C"
# proceed as you intended
data$date <- strptime(data$date, "%a %b %e %H:%M:%S %Y", tz="UTC")
# an example: "Thu Nov 8 15:41:45 2012"
# Then set back to your old locale
Sys.setlocale("LC_TIME", loc)
#> [1] "en_US.UTF-8"
#> [1] "POSIXlt" "POSIXt"
#> article_id article_title author board
#> 1 M.1529571783.A.45D [徵求] 中壢龍潭徵求誘捕籠 ji3h9 (直線) cat
#> content
#> 1 公司裡面 放貨的空間裡 原本有一隻貓在那邊遊蕩,因為抓不到,也就放他在那邊不理他 隔了一個多月發現,是一隻母貓,而且還附帶了三隻小的...... 今天本來要去試著驅趕他們,一進去沒多久,就發現我的腳滿滿的跳蚤 所以我想跟各位徵求誘捕籠,讓我不傷害他們一家子的捕獲他們 麻煩各位了(跪
#> date ip message_count.all message_count.boo
#> 1 2018-06-21 17:03:01 59.120.180.220 8 0
#> message_count.count message_count.neutral message_count.push
#> 1 6 2 6
#> messages
#> 1 高調, 高調, 高調, 我覺得你先在牠們背上點除蚤藥,才能讓貓成為活動除蚤機, 抓不到啊....., 動物醫院應該會有吧?, 兩星期前在中壢環中東路上的美達寵物精品借過誘捕籠,老, 闆人很好也很有愛心,可接洽看看, 06/21 18:33, 06/21 18:33, 06/21 18:33, 06/21 20:45, 06/21 21:41, 06/21 22:36, 06/21 23:10, 06/21 23:10, 推, 推, 推, 推, →, 推, 推, →, mashu520, MidoBanA, stw0975, jonie, ji3h9, kobe770403, bbrrnn, bbrrnn
#> url
#> 1 https://www.ptt.cc/bbs/cat/M.1529571783.A.45D.html
strptime的其他符號可參考:http://www.learn-r-the-easy-way.tw/chapters/5?fbclid=IwAR1Ap-tTxwmKNWVIKwBSfCS-Uv9TfrjSMmbFyHRpcOsPsahLDX4hdLazOv4
b. 將文字部分用jieba斷詞。 原本以tidyverse套件裡的filter來找標題含有「認養」和「買貓」的文章,但因為這個json檔讀進來以後,竟然是一個巢狀data frame,無法使用filter這個功能,會回傳錯誤,因此改用了data[grepl(“買貓”, data$article_title), ]這個方式來找符合的文章。 但接著遇到的是標題或文章內容斷詞的問題,要篩掉「買貓飼料」、「買貓罐頭」這種標題,因此需要斷詞。
seg <- worker()
data$content_splited_n <- lapply(data$content, function(x){seg[x]})
data$content_splited <- lapply(data$content_splited_n, function(x){paste(x, collapse=" ")})
data$content_splited[1:3]
#> [[1]]
#> [1] "公司 裡面 放貨 的 空間 裡 原本 有 一隻 貓在 那邊 遊蕩 因為 抓 不到 也 就 放 他 在 那邊 不理 他 隔 了 一個多月 發現 是 一隻 母貓 而且 還 附帶 了 三隻 小 的 今天 本來 要 去 試著 驅趕 他們 一 進去 沒多久 就 發現 我 的 腳 滿滿的 跳蚤 所以 我 想 跟 各位 徵求 誘捕 籠 讓 我 不 傷害 他們 一家子 的 捕獲 他們 麻煩 各位 了 跪"
#>
#> [[2]]
#> [1] "家中 有 一隻 眼睛 有 缺陷 的貓 前年 一直 在 興旺 給張 書豪 醫師 看診 覺得 張 醫師 真的 很 用心 很 愛 動物 眼科 很 專業 去年 搬離 台中 之後 就 沒 再 關心 興旺 今年 又 要 搬 到 彰化 還是 希望 之後 可以 再 跑 台 中 找 張 醫師 看診 看 了 興旺 FB 的 醫師 班表 之後 發現 張 醫師 不見 了 QQQQ 請問 有人 知道 張 醫師 是 去 了 別間 醫院 還是 去 了 哪 嗎 好 哦 謝謝 原本 是 想 說 如果 醫師 是 離職 了 這樣 問 好像 有點 尷尬 XD 若 沒人 知道 的話 會 直接 去問 醫院 的 因為 我 有 往前 翻 醫院 FB 前年 9 月 公告 張 醫師 要 進修 11 月 才 會 回來 結果 11 月班表 也 沒張 醫師 也 沒 特別 公告 QQ 啊 啊 是 這樣 非常感謝"
#>
#> [[3]]
#> [1] "貓咪 所在地 台北 新北 聯絡人 稱呼 譚 S 電話 站 內信 交換 貓咪 名字 虎媽 脾氣 很 好 不怕 人 很 顧 小孩 一郎 男生 很皮 也 很傻 是 最 大隻 的 哥哥 小開 女孩 超會 玩 很 聰明 噗 噗 女孩 最 黏 媽媽 傻萌 膽小 貓咪 年齡 約 1.5 個 月 剛 學會 咬咬 貓咪 花色 虎斑 媽媽 生小虎斑 3 是否 結紮 請 認養 人 配合 節育手術 健康 情況 已 驅蟲 預計 下禮拜 打預防針 照片 必須 提供 https i imgur com DUSEKZj jpg https i imgur com 4 uskhcc jpg https i imgur com a04LgN5 jpg https i imgur com RAxHbkb jpg https i imgur com 27 zAUsl jpg https i imgur com xy26eBO jpg 送養 原因 媽媽 流浪 街頭 遇到 朋友 好心 幫 她 待產 其他 補充 可 分送 養 媽媽 個性 很 好 很 穩定 很 溫柔 孩子 傻傻 天 真的 如 有人 願意 母帶 一孩紙 優先 認養 人 條件 要求 1. 不 排斥 新手 請 做 足 功課 2. 基本 經濟 條件 寵物 看 醫生 不 便宜 3. 不 放養 4. 定期 健康檢查 備註 請 站 內信 自我介紹"
閱讀筆記
目前正在閱讀「Python網路爬蟲與資料視覺化」這本書,作者是陳允傑,閱讀到第二章。
1. 關聯式資料庫(relational database): 不同的data frame中,如果有相同的欄位名稱(column name),就可以用外來鍵(foreign key)搜尋,例如:有兩個data frame,其中一個是客戶的基本資料,另一個是某個月份的訂單表格,兩個df都有客戶ID這個欄位,就可以得到像是「哪個地區的人在該月份訂購金額最大」這樣的資料,而對訂單這個df來說,客戶的居住地就是一個外來鍵。在建置df的時候,欄位的命名最好能夠一致,在往後的使用上會比較方便。
2. 欄頭信息(header information): 在爬取網頁資料時,可以透過Chrome查看欄頭信息,了解關於該網頁的一些組成成份,像是要下載一個.json檔的時候,會發現有一個「MIME type」的資訊裡寫著「application/json」,其他還有「text/csv」、「text/html」、「image/gif」等類型,基本上形式都是「type/subtype」,type主要有text、image、audio、video和application,我們在寄發email的時候電腦也是用這樣的模式在進行的。
3. Selector Gadget和Xpath Helper:實用的小工具: Selector Gadget 可以幫助我們在查看網頁的時候,以不同的顏色標示出我們想抓取的資料為何,再產生符合的 CSS 給我們。當我們點擊網頁的某個元素,會標示「綠色」,Selector Gadget會自動偵測其他符合的元素,標成「黃色」,之後再讓我們手動點掉不需要的元素,這時候會顯示「紅色」,接著就會出現最終的 CSS。可參考以下介紹:https://blog.gtwang.org/r/rvest-web-scraping-with-r/ Xpath Helper主要是搭配Chrome Inspector使用,輸入Xpath之後就會呈現抓取的結果。可參考:http://sweeteason.pixnet.net/blog/post/43059008-chrome-%E9%96%8B%E7%99%BC%E4%BA%BA%E5%93%A1%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%B4%B9---%E6%90%AD%E9%85%8D-xpath-helper-%E5%A5%97%E4%BB%B6