R語言學習:使用rvest包抓取網頁數據

rvest是R語言一個用來做網頁數據抓取的包,包的介紹就是“更容易地收割(抓取)網頁”。其中html_nodes()函數查找標簽的功能非常好用。以抓取天貓搜索結果頁的寶貝數據為例說明rvest的使用。

分析網頁

  1. 打開天貓,按F12鍵打開瀏覽器的開發工具。個人用的火狐,誰讓Chrom不支持linux了,唉。不過還是chrome好用啊。其他瀏覽器都有類似的功能。
  2. 隨便搜索個啥,比如核彈,我草還真出結果了!
  3. 接下來,在瀏覽器的開發工具"查看器"中查看網頁的源碼。或者按一下CTRL+SHIFT+C,選擇任意寶貝。可以看到寶貝的圖片、月銷量等數據都是包含在<div class="product-iWrap">...</div>塊中的。
  4. 打開該div塊,哈哈,咱們需要的商品圖片、鏈接、月銷量、價格,以及商戶名稱等,都可以在里面找到了。話說,貓爹其實挺開放的,沒有做太多限制,不然想抓這些數據就麻煩了。

接下來啟動R,以下是用rvest包抓取寶貝數據的過程

  • 安裝rvest包
install.packages("rvest")
  • 加載rvest包
library(rvest)
  • 保存搜索鏈接到對象gurl,鏈接的拼接方式挺有規律的
gurl <- "https://list.tmall.com/search_product.htm?q=%C9%AD%B1%C8%B0%C2&type=p&vmarket=&spm=875.7931836%2FB.a2227oh.d100&from=mallfp..pc_1_searchbutton"
  • 抓取數據保存到對象md中
  • %>%是管道操作符,意思是把左邊的操作結果作為參數傳遞給右邊的命令
  • div.product-iWrap 是CSS選擇器的語法,即是 div class="div.product-iWarp"
md <- gurl %>% 
        read_html(encoding="GBK") %>% # 讀取gurl的鏈接,指定編碼為gbk
        html_nodes("div.product-iWrap")  # 篩選出所有包含在<div class="product-iWrap">...</div>塊的內容
  • 從對象md繼續篩選,獲賣家名稱等數據。
  • html_attr("data-nick") 是從html_nodes()篩選出的標簽中,查找data-nick屬性的值。
  • gsub()是字符串查找替換的函數,pattern是指定用來查找的正則表達式。
  • html_nodes("p.productTitle>a[title]"),”>"指定的篩選條件的父級標簽。
  • html_text() 只抓取<標簽>內容</標簽>中的內容部分。
# 抓取賣家昵稱和ID
sellerNick <- md %>% html_nodes("p.productStatus>span[class]") %>% 
                html_attr("data-nick")  
sellerId <- md %>% html_nodes("p.productStatus>span[data-atp]") %>% 
              html_attr("data-atp") %>% 
              gsub(pattern="^.*,",replacement="")
# 抓取寶貝名稱等數據
itemTitle <- md %>% html_nodes("p.productTitle>a[title]") %>% 
             html_attr("title")
itemId <- md %>% html_nodes("p.productStatus>span[class]") %>% 
          html_attr("data-item")
price <- md %>% html_nodes("em[title]") %>% 
         html_attr("title") %>% 
         as.numeric
volume <- md %>% html_nodes("span>em") %>% 
          html_text
# 最后保存成數據框對象并存盤備用,以及寫入csv文件
options(stringsAsFactors = FALSE) # 設置字符串不自動識別為因子
itemData <- data.frame(sellerNick=sellerNick,
                       sellerId=sellerId,itemTitle=itemTitle,
                       itemId=itemId,
                       price=price,
                       volume=volume)
save(itemData,file="F:/mydata/itemData.rData")
write.csv(itemData,file="F:/mydata/itemData.csv")

補充一個用rvest從趕集網抓取二手房單頁面數據的代碼

getData <- function(gurl){
# 抓取趕集網二手房源單頁的數據
    library(rvest)
    # 趕集網首頁篩選長沙-雨花區-砂子塘的二手房源,獲得鏈接,o1為頁數
    # gurl <- "http://cs.ganji.com/fang5/yuhuashazitang/o1/"
    tmp <- gurl %>% html_session %>% 
           read_html(encoding="utf-8") %>% 
           html_nodes("div.f-main-list>div>div")

    # 單個房源的puid
    puid <- tmp %>% html_attr("id")
    # 單個房源的鏈接
    itemURL <-tmp %>% html_attr("href") %>% 
              gsub(pattern="/fang5",replacement="http://cs.ganji.com/fang5")
    # 縮略圖鏈接
    smallImg <- tmp %>% html_nodes("dl>dt>div>a>img") %>% html_attr("src")
    # 標題
    iTitle <- tmp %>% html_nodes("dl>dd>a") %>% html_attr("title")
    # 戶型
    iLayout <- tmp %>% html_nodes("dl>dd[data-huxing]") %>% html_attr("data-huxing")
    # 面積
    iArea <- tmp %>% html_nodes("dl>dd[data-huxing]") %>% 
             html_attr("data-area") %>% 
             gsub(pattern="[^0-9]",replacement="")
    # 篩選朝向等數據
    iTmp <- tmp %>% html_nodes("dl>dd[data-huxing]>span") %>% html_text
    iOrientation <- iTmp[seq(from=5,to=length(iTmp),by=9)] # 提取朝向
    iFloor <- iTmp[seq(from=7,to=length(iTmp),by=9)] %>% # 提取樓層
              gsub(pattern="\n",replacement="")
    iDecoration <- iTmp[seq(from=9,to=length(iTmp),by=9)] # 提取裝修
    # 提取地址
    iAddr <- tmp %>% html_nodes("dl>dd>span.area") %>% html_text %>% 
             gsub(pattern="\n",replacement=" ") %>% 
             gsub(pattern=" ",replacement="")
    # 提取價格
    iPrice <- tmp %>% html_nodes("dl>dd>div.price>span:first-child") %>% html_text
    # 提取單價
    iTime <- tmp %>% html_nodes("dl>dd>div.time") %>% html_text %>% 
             gsub(pattern="[^0-9]",replacement="") %>% as.numeric
    # 合并數據框
    iData <- data.frame(puid=puid,
                        iLayout=iLayout,
                        iArea=iArea,
                        iPrice=iPrice,
                        iTime=iTime,
                        iDecoration=iDecoration,
                        iFloor=iFloor,
                        iOrientation=iOrientation,
                        itemURL=itemURL,
                        smallImg=smallImg,
                        iTitle=iTitle,
                        iAddr=iAddr,
                        stringsAsFactors=FALSE)
    # 返回數據框
    return(iData)
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 從零開始學習rvest網絡爬蟲抓數據-Stone.Hou 大神 Hadley rvest in GitHub參考資...
    一筐莢果閱讀 12,172評論 0 21
  • <a name='html'>HTML</a> Doctype作用?標準模式與兼容模式各有什么區別? (1)、<...
    clark124閱讀 3,544評論 1 19
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,796評論 1 92
  • ?? 覺得和苗栗很有緣份, 以前在苗栗唸大學,但對苗栗沒有太大的感情, 在旅行社工作,偶爾兼差帶一日團, 為了準備...
    mavis0305閱讀 260評論 0 0
  • 你是一條大白魚躺在重慶的火鍋里鮮肉翻滾多少少女為你流著口水夾著筷子爭先恐后大汗淋漓誓要把你的肥美分食個 干 干 凈 凈
    間崎閱讀 287評論 2 3