R 語言爬蟲 之 cnblog博文爬取


a). 加載用到的R包

##library packages needed in this case library(proto) library(gsubfn)
## Warning in doTryCatch(return(expr), name, parentenv, handler): 無法載入共享目標對象‘/Library/Frameworks/R.framework/Resources/modules//R_X11.so’::
##   dlopen(/Library/Frameworks/R.framework/Resources/modules//R_X11.so, 6): Library not loaded: /opt/X11/lib/libSM.6.dylib
##   Referenced from: /Library/Frameworks/R.framework/Resources/modules//R_X11.so
##   Reason: image not found
## Could not load tcltk.  Will use slower R code instead.
library(bitops) library(rvest) library(stringr) library(DBI) library(RSQLite) library(sqldf) library(RCurl) library(ggplot2) library(sp) library(raster) ##由於我們的電腦一般是中文環境,但是我想要Monday,Tuesday,所以,這時需要增加設置參數 ##來告知系統采用英文(北美)環境用法。 Sys.setlocale("LC_TIME", "C")
## [1] "C"

b). 自定義一個函數,后續用於爬取信息。

## Create a function,the parameter 'i' means page number. getdata <- function(i){ url <- paste0("www.cnblogs.com/p",i)##generate url combined_info <- url%>%html_session()%>%html_nodes("div.post_item div.post_item_foot")%>%html_text()%>%strsplit(split="\r\n") post_date <- sapply(combined_info, function(v) return(v[3]))%>%str_sub(9,24)%>%as.POSIXlt()##get the date post_year <- post_date$year+1900 post_month <- post_date$mon+1 post_day <- post_date$mday post_hour <- post_date$hour post_weekday <- weekdays(post_date) title <- url%>%html_session()%>%html_nodes("div.post_item h3")%>%html_text()%>%as.character()%>%trim() link <- url%>%html_session()%>%html_nodes("div.post_item a.titlelnk")%>%html_attr("href")%>%as.character() author <- url%>%html_session()%>%html_nodes("div.post_item a.lightblue")%>%html_text()%>%as.character()%>%trim() author_hp <- url%>%html_session()%>%html_nodes("div.post_item a.lightblue")%>%html_attr("href")%>%as.character() recommendation <- url%>%html_session()%>%html_nodes("div.post_item span.diggnum")%>%html_text()%>%trim()%>%as.numeric() article_view <- url%>%html_session()%>%html_nodes("div.post_item span.article_view")%>%html_text()%>%str_sub(4,20) article_view <- gsub(")","",article_view)%>%trim()%>%as.numeric() article_comment <- url%>%html_session()%>%html_nodes("div.post_item span.article_comment")%>%html_text()%>%str_sub(14,100) article_comment <- gsub(")","",article_comment)%>%trim()%>%as.numeric() data.frame(title,recommendation,article_view,article_comment,post_date,post_weekday,post_year,post_month,post_day,post_hour,link,author,author_hp) }

c). 爬取 博客園的博文發布相關的數據 ,我這里只爬1-5頁的數據,100條記錄。

cnblog<- data.frame() for(m in 1:5){ cnblog <- rbind(cnblog,getdata(m)) }

d). 查看一下爬的數據。

dim(cnblog)
## [1] 100  13
head(cnblog)
##                                                     title recommendation
## 1 Dynamic CRM 2015學習筆記(3)oData 查詢方法及GUID值比較              0
## 2                                        Unity 之圓環算法              0
## 3                                        淺談研發項目經理              1
## 4                                                C# Redis              0
## 5              JavaScript系列----AJAX機制詳解以及跨域通信              0
## 6                                           MP4視頻編碼器              1
##   article_view article_comment           post_date post_weekday post_year
## 1            0               0 2015-04-10 20:46:00       Friday      2015
## 2           58               0 2015-04-10 19:57:00       Friday      2015
## 3          143               0 2015-04-10 19:38:00       Friday      2015
## 4          152               2 2015-04-10 19:25:00       Friday      2015
## 5           72               0 2015-04-10 19:14:00       Friday      2015
## 6           72               1 2015-04-10 19:14:00       Friday      2015
##   post_month post_day post_hour
## 1          4       10        20
## 2          4       10        19
## 3          4       10        19
## 4          4       10        19
## 5          4       10        19
## 6          4       10        19
##                                                    link     author
## 1       http://www.cnblogs.com/fengwenit/p/4415631.html     瘋吻IT
## 2 http://www.cnblogs.com/wuzhang/p/wuzhang20150410.html    wuzhang
## 3        http://www.cnblogs.com/fancyamx/p/4415521.html     maxlin
## 4       http://www.cnblogs.com/caokai520/p/4409712.html   每日一bo
## 5     http://www.cnblogs.com/renlong0602/p/4414872.html 天天向上中
## 6         http://www.cnblogs.com/dhenskr/p/4414984.html    dhenskr
##                             author_hp
## 1   http://www.cnblogs.com/fengwenit/
## 2     http://www.cnblogs.com/wuzhang/
## 3    http://www.cnblogs.com/fancyamx/
## 4   http://www.cnblogs.com/caokai520/
## 5 http://www.cnblogs.com/renlong0602/
## 6     http://www.cnblogs.com/dhenskr/
tail(cnblog)
##                                  title recommendation article_view
## 95          前端資源預加載並展示進度條              3          560
## 96  Android中的Handler的機制與用法詳解              1          213
## 97              JS學習筆記3_函數表達式              0          219
## 98                    iOS-MVVM設計模式              0          228
## 99             HTML5簡單入門系列(七)              0          385
## 100  【Win 10應用開發】認識一下UAP項目              5          523
##     article_comment           post_date post_weekday post_year post_month
## 95                4 2015-04-08 18:03:00    Wednesday      2015          4
## 96                0 2015-04-08 18:02:00    Wednesday      2015          4
## 97                0 2015-04-08 17:56:00    Wednesday      2015          4
## 98                0 2015-04-08 17:47:00    Wednesday      2015          4
## 99                0 2015-04-08 17:36:00    Wednesday      2015          4
## 100               6 2015-04-08 17:31:00    Wednesday      2015          4
##     post_day post_hour
## 95         8        18
## 96         8        18
## 97         8        17
## 98         8        17
## 99         8        17
## 100        8        17
##                                                              link   author
## 95  http://www.cnblogs.com/lvdabao/p/resource-preload-plugin.html 每日一bo
## 96            http://www.cnblogs.com/JczmDeveloper/p/4403129.html   呂大豹
## 97                     http://www.cnblogs.com/ayqy/p/4403086.html Jamy Cai
## 98                    http://www.cnblogs.com/xqios/p/4403071.html     夢燼
## 99                   http://www.cnblogs.com/cotton/p/4403042.html   ciderX
## 100                 http://www.cnblogs.com/tcjiaan/p/4403018.html 棉花年度
##                                 author_hp
## 95      http://www.cnblogs.com/caokai520/
## 96        http://www.cnblogs.com/lvdabao/
## 97  http://www.cnblogs.com/JczmDeveloper/
## 98           http://www.cnblogs.com/ayqy/
## 99          http://www.cnblogs.com/xqios/
## 100        http://www.cnblogs.com/cotton/

e). 我這里只查看Mar.02-Mar.29四個周的博文數據,下面對數據進行簡單處理。

##cnblog_Mar<- sqldf("select * from cnblog where post_day>=2 and post_day<=29")#這里我們只分析3月份四個周的數據。 cnblog_Mar$post_weekday<- factor(cnblog_Mar$post_weekday,order=TRUE,levels=c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")) cnblog_Mar$post_hour <- as.factor(cnblog_Mar$post_hour)

f). 簡單數據分析——圖表呈現

Mar.02-Mar.29,博客發布數量按周分布

ggplot(data=cnblog_Mar,aes(post_weekday))+geom_bar()

每日博文數量分布

ggplot(data=cnblog_Mar,aes(post_date))+geom_bar()
## stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.

每個小時博文發布量分布

ggplot(data=cnblog_Mar,aes(post_hour))+geom_bar()

g). 總結

  • 用R 寫的這種爬蟲總共是兩部分 1.自定義一個函數,將原型寫出來。2.利用自定義函數,寫個循環就可以歡樂的爬數據了。其中第一步找准確html_nodes是關鍵
  • Google chrome 瀏覽器結合 CSS selector 使用,尋找html_nodes 非常方便。
  • 存在table的網站,爬數據更方便。例如NBA 2014-2015常規賽技術統計排行 - 得分榜,若不存在table,則需要一個字段一個字段的爬取了,例如博客園
  • 商業網站的數據都是他們的寶藏,例如淘寶,京東,攜程
  • 接下來打算爬一些招聘網站的數據,分析一下自己感興趣的行業的薪資待遇,以及是哪些公司在招聘,工作地點在哪里,崗位對技術要求是什么,是R,是python,是SAS,還是數據庫等等。
  • 我的前兩次爬蟲在博客園寫了一篇博客,有興趣的可以去看看R語言網絡爬蟲學習 基於rvest包


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM