r语言解析html,R语言爬虫入门-rvest教程
安裝包
# install.packages("rvest")
查看rvest包的詳細信息
library(help = rvest)
包的用法:
read_html() 讀取html文檔的函數,其輸入可以是線上的url,也可以是本地的html文件,甚至是包含html的字符串也可以。
html_nodes() 選擇提取文檔中制定元素的部分。可以使用css selectors,例如html_nodes(doc, "table td");也可以使用xpath selectors,例如html_nodes(doc, xpath = "//table//td")。
html_tag() 提取標簽名稱;html_text() 提取標簽內的文本;html_attr() 提取指定屬性的內容;html_attrs() 提取所有的屬性名稱及其內容;
html_table() 解析網頁數據表的數據到R的數據框中。
html_form(),set_values()和submit_form() 分別表示提取、修改和提交表單。
在中文網頁中我們經常會遇到亂碼的問題,這里提供了兩個函數來解決:guess_encoding()用來探測文檔的編碼,方便我們在讀入html文檔時設置正確的編碼格式,repair_encoding()用來修復html文檔讀入后的亂碼問題。
還有一些函數,用來模擬網上的瀏覽行為,如html_session(),jump_to(),follow_link(),back(),forward(),submit_form()等等。
library(rvest)
web
position % html_nodes("p.pl") %>% html_text()
web
position
第一行是加載Rvest包。
第二行是用read_html函數讀取網頁信息(類似Rcurl里的getURL),在這個函數里只需寫清楚網址和編碼(一般就是UTF-8)即可。
第三行是獲取節點信息。用%>%符號進行層級劃分。web就是之前存儲網頁信息的變量,所以我們從這里開始,然后html_nodes()函數獲取網頁里的相應節點。在下面代碼里我簡單的重現了原網頁里的一個層級結構。可以看到,實際上我們要爬取的信息在25個class屬性為pl的
標簽里的文本。
[清] 曹雪芹 著 / 人民文學出版社 / 1996-12 / 59.70元
而對于這樣的結構,在htmlnodes()函數里的寫法就是簡單的 "p.pl",其中“.”表示class屬性的值,如果是id屬性則用“#”,如果大家學過CSS選擇器就很好理解了,是完全一致的。
最后我們用html_text()函數表示獲取文本信息,否則返回的是整個
標簽。總體上用以下一行代碼就可以實現:
Example 2
到天氣網(http://lishi.tianqi.com/)抓取特定頁面的數據, 首先需要在瀏覽器中調試js代碼,chrome中按F12即可查看。通過搜索關鍵字:日期,最高氣溫 ...任何一個都行,得到以下信息。可以發現我們所需要的數據都在
盒子中,而每一行數據又都在ul中。所以,我們可以通過這兩個特征來提取數據。獲取
以及ul中內容的R代碼如下:library(rvest)
library(plyr)
city
date
baseUrl
Url
content %
read_html(encoding='GBK') %>%
html_nodes('div.tqtongji2') %>%
html_nodes("ul") %>%
html_text()
head(content)
發現數據之間用rntt之類的隔開。而'rntt'這些里面有:回車符,換行符和制表符。他們的共同點就是全都是空格。所以我們可以通過空格來進行分列,提取相應的數據。
content % strsplit("\\s{4,}")
content
為了美觀和方便操作,我們把它轉換為數據框的形式:
content
names(content)
content
Example 3 R 爬蟲之 rvest 包 :穿越表單 + 圖片下載器
什么是會話?會話的出現是為了跟蹤 cookie,保證 cookie 長期有效,只有當會話被關閉時,cookie 便會失效。你可以把會話(Session)想象成在瀏覽器中打開的頁面窗口,你之所以可以在這個窗口執行很多操作,這是因為服務器端知道你的 cookie 中存在有效的 SessionID,所以服務器會一直通過你的請求,把資源給你。
為什么要創建會話?后面我們將實現表單穿越時,需要保證是在會話窗口執行。
怎么創建會話?使用 html_session( ) 函數。
u
session
什么是表單?HTML 中的表單被用來搜集用戶的不同類型的輸入。例如,登錄表單、搜索框表單等。HTML 表單
包含表單元素,表單元素是指不同類型的 input 元素、復選框(box)、單選(radio)、提交按鈕(submit)等。怎么穿越表單?分為以下幾步:
提取出你所需要的表單:html_form( )
填寫你的表單:set_values(form, name1=value1, name2=value2)
提交表單,發送給服務器:submit_form(session, form)
forms % html_form()
forms
form
form
在上面的結果中,只有 'search_text' :的冒號后為空,這表明 'search_text' 還沒有填充任何值,而我們的填充任務就是把它填上。比如說我要搜索“美人魚”,那么我就在set_values( ) 中指定一個 search_text 參數,令它的值為“美人魚”。
那么,現在我們的表單已經填充好了,只需要把它提交給服務器了。
filled_form
session2
session$url # 查看初始 session 的 url
session2$url # 查看提交表單后,返回的新會話 session2 的 url
iconv(URLdecode(session2$url), "UTF8")
顯然,在提交表單后,我們訪問的鏈接發生了變化。
PS:session2$url 之所以會有一堆 %A %B 之類的符號,是因為我們搜索的文本是中文,所以提交請求時,鏈接中的中文被再次編碼。執行下面語句,便可以將鏈接變成我們能看懂的形式:
總結
以上是生活随笔為你收集整理的r语言解析html,R语言爬虫入门-rvest教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android集成测试工具,androi
- 下一篇: 雷鸟创新完成过亿元首轮融资!加速消费级A