[R]利用R Markdown生成爬蟲分析報告

首先上圖,不得不說利用R Markdown編寫的分析報告太符合我這種技術小白的審美了,非常乾淨簡約,也無需過多的去調弄格式,是寫報告的首選!(目前對於含有中文的Markdown報告,本人只能導出為html文件用瀏覽器預覽,只能通過截圖的形式在此呈現,之後會試著導出為pdf和word版本)

上面就是利用R Markdown生成R語言爬蟲完整的分析報告,非常短小精悍,畢竟R Markdown和爬蟲技術都是第一次接觸。

一直有聽說爬蟲這個技術,但從未上手,首次嘗試體驗還是不錯的,在爬取到數據的一瞬間內心異常激動,雖說是模仿爬取豆瓣圖書top250(zhuanlan.zhihu.com/p/22),但自己也試著去理解了短小代碼背後的原理與規則。

1、關於報頭的獲取

以百度首頁為例,按F12開發者工具顯示下面圖一所示頁面,我們發現右側Network下面命令是空的,隨便點擊左側任一地方,右側會多一個請求指令,如圖二Name列所示,這就是所謂的報頭,點擊可以查看詳細的信息,我們會發現偽裝報頭裡的一些信息在此都有顯示。(具體為啥有報頭這一過程有待研究)

2、關於網頁的抓取

其實網頁是大量html源碼的集合,進行爬蟲的目的就是想從網頁上獲取我們需要的內容,而這些內容都有指定的html語言,只要下載了網頁,獲取它的源碼,再對源碼進行解析就能達到爬蟲的目的。簡單看一下:

豆瓣圖書top250這個網頁的url(統一資源定位符,每個網頁都有唯一的一個)

根據url臨時將這個網頁下載下來(得到的其實是html源碼),查看源碼的方式有兩種:空白處右鍵單擊「查看網頁源代碼」或者單擊「F12」按鈕,兩種方式所得的界面分別如下,不管通過哪種方式所得到的源代碼是不會改變的。方式二可能在選取內容時更加精準方便,單擊左上角箭頭,再任意選取左邊網頁內容,右邊就相應跳到對應源碼。

3、源碼的分析(定位節點)

了解一點html的人都知道源碼的編寫是起於開始標籤和結束於結束標籤(摻雜不同標籤的層級嵌套)中間包含的就是元素內容,抓取內容最重要的就是定位標籤和節點,看個例子,上圖左側標黃的圖書信息的源碼就是下圖藍色部分,屬於p標籤class="pl"下的文本內容。接下里就是將定位代碼更換成XML包所能識別的格式,比如屬性值用單引號,「//」表示所有該類型節點等。

上圖定位的格式可以表示為 p[@class=pl]/text() (注意:標籤里的屬性用中括弧@形式,下一級用 / 形式)

我們抓取的不是這一條信息,而是所有該類型節點的,故在前面加 //,所以下面節點定位的代碼就很好理解了。

node<-getNodeSet(pagetree, "//p[@class=pl]/text()")n

關於節點定位這一塊是最重要的內容,下面重點給出XML里常用的節點定位方法與代碼,可以作為參考:

# 選取屬於 bookstore 子元素的最後一個 book 元素。 ngetNodeSet(doc,/bookstore/book[last()]) nn# 選取最前面的兩個屬於 bookstore 元素的子元素的 book 元素 ngetNodeSet(doc,/bookstore/book[position()<3]) nn# 選取所有擁有名為 lang 的屬性的 title 元素。 ngetNodeSet(doc,//title[@lang]) nn#選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性 ngetNodeSet(doc,"//title[@lang=eng]") nn# 選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大於 35.00。 ngetNodeSet(doc,"/bookstore/book[price>35.00]") nn# 選取 bookstore 元素中的 book 元素的所有 title 元素,且 price 元素的值須大於 35.00。 ngetNodeSet(doc,"/bookstore/book[price>35.00]/title") nn# 選取 book 元素的所有 title 和 price 元素 ngetNodeSet(doc,"//book/title | //book/price") nn# 選取文檔中的所有 title 和 price 元素 ngetNodeSet(doc,"//title | //price") nn# 選取 bookstore 元素的所有子元素 ngetNodeSet(doc,"/bookstore/*") nn# 選取所有帶有屬性的 title 元素 ngetNodeSet(doc,"//title[@*]") nn# 選擇所有屬性lang的值 nunlist(getNodeSet(doc,"//title/@lang"),use.names = FALSE) nn# title結點下的所有文本 ngetNodeSet(doc,"//title/text()") n

最後給出在R Markdown中編寫報告的源代碼,僅供參考!

---ntitle: 利用R Markdown生成R語言爬蟲分析報告noutput: html_documentn---nn##一 前言介紹n本文結合R語言爬蟲技術對相關網站進行信息提取,將結果用R Markdown 編輯成動態文檔,在R第三方集成開發軟體RStudio(**R自帶的RGUI不支持rmarkdown包的安裝**)環境中執行並編輯,防止數據變動引起文檔一系列的改動,也可以將此作為數據分析報告的一種編寫形式。nn##二 安裝必要的包nn###1.編寫文檔所需n利用R Markdown編輯文檔需要使用rmarkdown包,該包的安裝需要在RStudio編輯器環境中進行。nrmarkdown包的安裝與載入(第一次使用時安裝即可,之後每次使用都需要載入)nn```{r, warning=FALSE}nlibrary(rmarkdown)n```nn###2.爬蟲所需n利用R語言進行爬蟲的方法有多種,在此介紹相對簡單的一種方法,利用RCurl和XML包。在載入使用這兩個包的時候可能會提示需要使用其他包,按提示安裝載入即可。nn```{r, message=FALSE, warning=FALSE}nlibrary(RCurl)nlibrary(XML)n```nn```{r eval=FALSE}nlibrary(RMySQL)nlibrary(DBI)n```nn##三 爬蟲步驟nn###1.模擬瀏覽器行為,偽裝報頭(不需要隨時更換,用這一個就好)nn```{r}nmyHttpheader <- c(n "User-Agent" = "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.6) ",n "Accept" = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",n "Accept-Language" = "en-us",n "Connection" = "keep-alive",n "Accept-Charset" = "GB2312,utf-8;q=0.7,*;q=0.7")n```nn###2.模擬訪問頁面,臨時下載網頁n```{r}nurl <- "豆瓣圖書 Top 250"nwebpage <- getURL(url,httpheader = myHttpheader)n```nn###3.整理HTML結構(注意標紅的編碼地方)n```{r}npagetree <- htmlTreeParse(webpage,encoding = "UTF-8", error = function(...){}, useInternalNodes = TRUE,trim = TRUE)n```nn###4.節點定位n```{r}nnode <- getNodeSet(pagetree, "//p[@class = pl]/text()")ninfo <- sapply(node,xmlValue) ninfon```n

推薦閱讀:

教你輕鬆爬取Air-Level網站的城市地區數據
你眼中的我
左手用R右手Pyhon系列——趣直播課程抓取實戰
當大家都在討論金剛狼3的時候,他們到底在說些什麼~

TAG:Markdown | 网页爬虫 |