R語言中,RCurl優勢在哪兒,做爬蟲的話用Python還是RCurl效率高?

想學一點爬取網路數據的工具,R有基礎,Python的話要從頭學,求高手指點下


對於結構比較良好的網頁,用rvest包效率最高,可以用css和xpath選擇器,用管道操作。

hadley/rvest · GitHub


專欄:拓端數據研究院

由於電商網站的數據的實時性要求,數據分析時一般直接從網頁爬取。因此使用爬蟲的方法顯得十分重要。R作為數據分析的軟體,可以直接對爬取的數據進行後續處理,加上上手快的特點,是電商網站數據爬取和分析的好工具。

下面以http://cn.shopbop.com/為例 簡單分享下使用Rcurl對網站進行數據爬取的過程。

首先需要在Rgui里安裝需要的軟體包

require("RCurl")

require("rjson")

require(stringr)

require(XML)

#得到網頁地址,並將其轉換成html源碼

url = "http://cn.shopbop.com/"

doc = getURL(url)

txt = htmlParse(doc, asText = TRUE)

print(txt)

#由於獲取網頁中商品數據需要對html源碼結構進行分析,因此可以直接在瀏覽器中查看後,再到R中進行編輯

在源碼中很容易找到網站導航中子網站的網址

#因此可以通過xmlPath語言找到相應子網站的節點

a &<- getNodeSet(txt, path = "//a[@class = "parent topnav-logged-in "]")#找到子網頁的xml路徑

如果得到的中文有亂碼,則需要對編碼進行轉換

b &<- sapply(a,xmlValue)

c &<- iconv(b,"utf-8","gbk")

c

否則 可以通過xmlGetAttr函數 得到所需的attributes

d &<- sapply(a,xmlGetAttr , "href")#獲取子網頁

由於得到的只是子網頁的路徑,要獲取子網頁的數據 需要用paste鏈接網站根目錄地址

d1=paste(url,d[1],sep="" )

#對於批量爬取商品的信息還需要獲取商品展示子網頁的頁數

每頁顯示40個商品,一共有1200個商品。

通過網址,我們很容易了解商品展示頁的地址規則。

#因此,可以通過一個簡單的循環來獲取所有網頁的地址,從而獲取每個網頁的所有商品信息。

a &<- getNodeSet(txt, path = "//span[@class = "page-number"]")#找到子網頁的xml路徑(部分代碼省略)

d &<- sapply(a,xmlGetAttr , "data-number-link")#獲取子網頁中的目錄

pagenum=strsplit(d,"=")

maxpagenum=0;

for(i in 1:length(pagenum)){

maxpagenum[i]= pagenum[[i]][3]

}

maxpagenum=max(as.numeric(maxpagenum))

#[1] 1200

#在獲得所有網頁後,獲取所有商品的信息就變得簡單了,只要循環對每個網頁的信息進行xml關鍵字的爬取

#名稱信息

圖片信息

價格信息

通過文本處理和輸出,就可以將其進行保存和後續的數據分析。

歡迎交流討論批評指正(qq 570881451)

更多資訊歡迎關注微信號:ClanofData 拓端數據

博客 gegeb1ue_新浪博客


如果是ajax動態網頁,用python + selenium效率最高


uu居然沒有人推薦 scrapy,目前最好用的爬蟲,上面極為說只是如何解析頁面,不管 lxml, beautifulsoup 還是 xpath,都差不多,你高興,用正則都沒問題!

scrapy 使用 twisted 作為並發請求和頁面處理,當然你也可以使用 tornado 或其他並發框架來加速爬蟲,另外 scrapy 還做了 dns 緩存,加速 url 的解析速度!

當然得看場景,一次就撈取幾十個頁面,那你隨便用什麼都不會差太遠,如果撈取幾萬,幾十萬的頁面,我上述介紹的 scrapy 的特性,撈取數據的時間大大的減少了!

另外,如果真要用 curl,我還更喜歡使用 shell,還可以用 pararel 並發請求數據,還更簡單!

補充,如果需要解析 js,我推薦使用 phantomjs(c 寫的),簡單快速,java 的 selinium (或者 ruby 的 watir)設計初衷就是用作前端自動化測試,做爬蟲,那就別自找坑了。。。

####更新 20151118########

最近抓取weibo搜索指數數據時候,發現了另一個命令行瀏覽器工具 slimerjs - 火狐家,採用火狐自家的 gecko 引擎;


放棄 phantomjs 的 原因是 phantomjs 的 onResourceReceived 事件監聽只能獲取到 header,而無法獲取到 body,是個 bug,目前未修復

也是一個很不錯的工具,不過有一個缺點就是安裝起來比較麻煩


學生玩玩入門爬蟲的話,對於採集一下簡單的網頁代碼,Python與RCurl沒區別。

高手玩爬蟲,會涉及動態渲染、OCR、分散式、高性能,這些東西與Python與RCurl沒半毛錢關係,根本就不會去用Python或RCurl。


Python 用requests + BeautifulSoup 很方便。
【Step1】獲取html:
import requests
r = requests.get(『http://www.hisuncle.com/spider』)
html = r.text #這樣3行代碼就把網頁的html取出來了
【Step2】解析:
html用你喜歡的方式解析就可以了,牛逼的話可以直接正則。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html) #這樣2行就可以很方便的操作soup解析了

或者專業點的用scrapy爬蟲框架,默認用xpath解析。 GoodLLuck!(感謝李明指正! )


XML包
require(XML)
x1 = readHTMLTable("http://finance.yahoo.com/q/hp?s=BIDU+Historical+Prices", which = 15)
x2 = htmlParse("http://finance.yahoo.com/q/hp?s=BIDU+Historical+Prices")
xpathSApply(x2, "//tr", getChildrenStrings)


Rcurl對我這樣的初學者有些挺尷尬的地方,不知各位大俠有何見解:因為不知道R裡面怎麼迴避保留字——比如網址中的#(這符號是R的注釋保留字);又如用postForm函數做登錄網站的腳本,postdata中的某個欄位正好叫password或verbose之類,這些都是這個函數參數的名稱,好像會造成這個欄位的值沒法正常傳入。這兩個問題有什麼辦法么?
具體請見 用R寫爬蟲遇到問題:Rcurl postForm登錄動作傳遞的變數名和保留字衝突


效率這個東西,其實跟語言沒什麼關係,關鍵是看寫的怎麼樣。同是用python寫爬蟲,從多線程轉到非同步,效率就能提高十多倍


推薦閱讀:

如何爬取網頁表格數據?

TAG:爬蟲計算機網路 | R編程語言 |