每當(dāng)程序員們感嘆“人生苦短”的時候,都會想到Python——這段子已經(jīng)如同“Hello World”一樣成為圈子里的流行梗——不過最近,我對Python的感覺還是發(fā)生了變化。上周末我們一群奔三的研究僧在南京碰頭,我發(fā)現(xiàn)大多數(shù)公共管理方向的學(xué)生學(xué)習(xí)Python的原始動力來自于網(wǎng)頁爬蟲——為論文找到更好的數(shù)據(jù);但是顯然,僅就這個目的而言,新學(xué)一門編程語言還是一件不太輕松的事,加上Python3.X與Python2.X命令在語法結(jié)構(gòu)上略有差異,讓我越來越感覺在公共管理的江湖上,Python網(wǎng)頁爬蟲的武林地位有可能被R語言取代。 這一期就來講講如何用R語言寫網(wǎng)頁爬蟲,我用爬蟲教程慣用的案例——下載和解析豆瓣電影TOP250的數(shù)據(jù)來做具體演示;對于其他的網(wǎng)頁爬蟲方法及工具,請參閱我的另一篇文章:抓取網(wǎng)頁數(shù)據(jù)的六種工具,那篇文章里包含一段“百度新聞”的Python爬蟲代碼。 我在正式裝13之前,需要先來解釋三個概念:HTML、CSS和 JavaScript,這有助于理解后面的代碼;我假設(shè)這篇文章的讀者沒有修過類似“大學(xué)計算機基礎(chǔ)”這樣的課程,如果有讀者學(xué)習(xí)過這門課程,下面這一部分就可以直接跳過。
什么是“網(wǎng)頁”?就是我們每天用瀏覽器打開的東西唄——不行,這個定義太感性了,我換一個更理性一點的問題——網(wǎng)頁是怎么用代碼寫成的?要回答這個問題,我們不妨找來一個網(wǎng)頁看看,就拿“京東商城”來說事兒吧,畢竟免費給老學(xué)長打廣告我還是樂意的;下面是京東的主頁及源代碼(我用的是Microsoft Edge瀏覽器,網(wǎng)頁右擊“查看源”,下同;其他瀏覽器類似): 怎么樣,雙11瘋狂剁手的時候有沒有想過,你的每一次點擊背后,是一行行這樣的代碼在執(zhí)行?所以啊姑娘們,請珍惜你身邊每一位真誠的程序猿吧……好了扯遠(yuǎn)了,說好不把個人情緒帶入工作中的……來回答上面那個問題:什么是“網(wǎng)頁”?“統(tǒng)計之都”(好吧是在為另一位老學(xué)長打廣告了)給過一個我目前看過最為合適的定義:網(wǎng)頁的源代碼就是純文本(吐槽:盡管聽起來像是廢話);網(wǎng)頁源代碼包含HTML,CSS 和JavaScript三種文本結(jié)構(gòu),即標(biāo)記語言(HTML,只有語法,沒有變量和邏輯)、層疊樣式表(CSS,用于控制元素的展現(xiàn)形式)、腳本語言(JavaScript,操作HTML中元素的增刪改);而我們要的數(shù)據(jù)就在HTML元素中,什么意思?下面就正式開始我的表演了:
我們這一期的任務(wù)是抓取“豆瓣電影TOP250”上所有電影的“名稱、得分、簡評”3項內(nèi)容——我們暫時稱之為“字段”;首先我們得看看這3個字段在網(wǎng)頁源代碼中的位置: 顯而易見,在“豆瓣”的源代碼里,“名稱、得分、簡評”分別對應(yīng)class='title'、class='rating_num'、class='inq'3個字段,這些就是我們需要爬取的數(shù)據(jù)——隱藏在HTML的元素中。
這里抓取網(wǎng)頁數(shù)據(jù)的基本思路是,抽取出以title、rating_num以及inq為標(biāo)簽的內(nèi)容;這就用到了上面提到的CSS思想——通過層疊樣式表的標(biāo)簽屬性達到篩選的目的。下面開始網(wǎng)頁爬取: 首先安裝并加載rvest包 install.packages('rvest') library('rvest') 然后定義爬取的網(wǎng)站,并從網(wǎng)站中讀取HTML代碼 url <- 'https://movie.douban.com/top250' read_html(url) %>%html_nodes('.title') %>% html_text() 注意,上面的“%>%”是R語言中的管道函數(shù),表示把左邊的值輸出為右邊函數(shù)的第一個參數(shù): 最后依次抓取另外兩個字段: read_html(url) %>% html_nodes('.rating_num') %>% html_text() read_html(url) %>% html_nodes('.inq') %>% html_text() 從調(diào)用rvest包到爬取出結(jié)果,正好三行代碼。
|
|