最近在嘗試用R寫簡單的網絡爬蟲,順手分享一下代碼和學習筆記。適合新手閱讀。
關于編程
非程序猿出身的同學們可能會對打代碼這件事情抱有天然的敬畏感,什么JSON、Ajax、CDN、React Native之類層出不窮的術語,一聽到就很頭疼。雖然程序猿的世界水很深,但是成為一個入門級選手也并沒有我們想的那么難。
Just Do It,我覺得這是個很好的法則。找一個感興趣的項目,動手開干,當你解決了所有技術問題和知識盲區終于完成項目后,就已經進步很多了。
前期準備
網絡爬蟲是一個很有意思的技術,如果會寫個簡單的爬蟲,就可以用來爬取網頁上的數據,自己可以做做簡單的分析,獲取一些新的知識。用R或者用Python都可以寫,據說Python的能力更強大一些。但是由于我只學過R沒學過Python,所以還是先從R入手。
開始碼代碼之前,首先為自己選擇一個感興趣的課題。我選擇的是IT桔子上的互聯網公司融資記錄,大概是下圖這個樣子的。這個網站并不要求登錄后才能查看,沒有其他的鑒權機制,數據可以直接爬下來,難度不高。因為每頁只顯示10條數據,所以我們需要用一個循環爬取多頁的數據。
我們的目標是把這些數據以結構化的方式存儲下來,并將數據導出到Excel表格中。
代碼分析
首先上代碼:
1、安裝程序包
Rvest是用R做網絡爬蟲時最常用的程序包之一,另一個常用的程序包是RCurl。第三部分的幾個關鍵函數read_html、html_nodes和html_text都是Rvest程序包中的函數。
安裝xlsx程序包是為了最終將獲取到的數據輸出到excel中,如果沒有這個需求也可以不安裝這個包。第四部分的函數write.csv就是xlsx中的函數。
2、定義變量
我把CSS選擇器的定義放在了這個階段,因為雖然需要爬取幾個不同的頁面,但是頁面結構都是一樣的,所以幾個頁面都使用一樣的CSS Selector。CSS選擇器要怎么寫可以參考這篇文章。如果不太懂的話,有一個很簡單的方法:
如果你用的是Chrome瀏覽器,鼠標移到你關注的元素上,右鍵-檢查,就可以打開開發者工具并且自動定位到你剛剛選的元素上。確認你要的信息在哪個元素中之后,選中-右鍵-Copy-Copy selector,就可以復制下來對應元素的CSS選擇器。
這一部分的最后兩行代碼是用來定義存儲數據的矩陣com的。這里需要先定義矩陣的大小,否則在后面的循環中會報錯。為了便于識別信息,順便定義了矩陣的列名。
3、開始循環,爬取內容
觀察IT桔子的融資事件列表頁面,幾個頁面的url結構基本是一致的,所以根據這個規律我們可以定義每一個頁面的url字符串。
read_html函數將url中的信息讀取到read變量中。html_nodes讀取了我們選擇的CSS選擇器對應的元素的內容,而html_text()函數表示只讀取其中的文本信息。這樣子我們就把網頁中的主要信息讀取到變量info中了。
得到的info是下面這樣的一個混亂的字符串,有很多我們不需要的\n\t。
這里主要通過gsub和strplit兩個函數實現字符串的替換和分割,看起來似乎比較復雜,但是對不同情況的字符串會有不同的處理方法,所以這里不細講。可以通過在R中鍵入help(gsub)和help(strsplit)來查看函數的具體使用方式。經過整理后的數據是這樣的:
接下來通過一個嵌套循環將整理好的數據寫入com中。寫入數據后的com是這樣的:
4、輸出到csv文件
使用一個簡單的函數write.csv就可以把com變量寫入到指定的文件中了。最終輸出的表格是這樣的:
后記
對于大多數網站來說寫個爬蟲把數據爬取下來并不難,但是有些網站需要登錄,有些網站有反爬蟲機制,就需要花費更多功夫跟這些網站斗智斗勇。
R同時也可以做數據分析,以及輸出非常漂亮的可視化圖表。所以我們把數據整理到excel表格中并不是終點,用R還可以做很多其他嘗試。