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寫爬蟲,從多線程轉到非同步,效率就能提高十多倍
推薦閱讀: