R語言讀取淘寶的單品頁的名稱和價格

  1. #lab1

  2. library(XML);

  3. url1<-"http://data.caixin.com/macro/macro_indicator_more.html?id=F0001&cpage=2&pageSize=30&url=macro_indicator_more.html#top";

  4. url<-htmlParse(url1,encoding="UTF-8")#把html文件讀入r語言中並解析


  5. #找結點

  6. test <- getNodeSet(url,'//meta[@name]')#xpath語法找到html部件#顯示的中文正常

  7. #讀取結點的內容:xmlValue內部參數只能是一個字符串

  8. test_text_list<-sapply(test, xmlValue)#提取內容,多個的化以向量形式存儲

  9. test_text<-xmlValue(test`2`)#把test的第2箇中的內容提取出來=test_text_list[2].注意,即時test只有一組數據也要使用test`1`,不可以直接使用test(不是字符串)

  10. #讀取結點的屬性:xmlGetAttr內部參數只能是一個字符串

  11. content1<-xmlGetAttr(test`1`, "content")#讀取test`1`中的content內容。注意直接用test不可以。#顯示的中文不正常

  12. content1<-iconv(content1,"UTF-8","gbk")#解決中文正常顯示問題



  13. #lab2使用R語言爬取淘寶網站的筆記本商品價格和名稱

  14. library(XML);

  15. url1<-"http://3c.taobao.com/detail.htm?spm=872.217037.254698.6.deIiSJ&spuid=205341228&cat=1101"

  16. url2<-"http://3c.taobao.com/detail.htm?spm=872.217037.254698.11.deIiSJ&spuid=203228104&cat=1101"

  17. read_taobao<-function(url){

  18.     name_text<-""

  19.     price_text<-""

  20.     i<-1

  21.     for(i_url in url){

  22.         i_url2<-htmlParse(i_url,encoding="UTF-8")#讀取html數據

  23.         name<- getNodeSet(i_url2,"//div[@id='idetail']//div[@class='info-area']//div[@class='tlt clearfix']//h1")#通過xpath找到網頁中的name

  24.         #xpath://任意位置的  @是屬性

  25.         name_text_tmp<-xmlValue(name`1`)#提取name的內容

  26.         price<-getNodeSet(i_url2,"//div[@id='idetail']//div[@class='info-area']//div[@class='key-info']//span[@class='price']")#通過xpath找到網頁中的price

  27.         price_text_tmp<-xmlValue(price`1`)#提取price的內容

  28.         name_text[i]<-name_text_tmp

  29.         price_text[i]<-price_text_tmp

  30.         i<-i+1

  31.     }

  32.     data.frame(name=name_text,price=price_text)

  33. }

  34. url<-c(url1,url2)

  35. read_taobao(url)

複製代碼

http://www.bassary.com/?p=1107

  1. #*************網頁爬蟲-R語言實現,函數庫文件*******#

  2. #****作者:oldlee11***************************************#

  3. #****版本:v0.1*******************************************#

  4. #****時間:2012-11-14*************************************#

  5. library(XML);

  6. #****函數:(crawler1)

  7. #****概要:網絡抓取的主要函數1,可以抓取n個網頁的m個變量。每個xpath只爬取一個數據,如果大於1個則提示有誤。(精確抓取)

  8. #****輸入:

  9. #        名稱           |    數據格式

  10. #        url            |    欲抓取的網站的url                向量:n個

  11. #        xpath          |    給出的抓取變量的xpath            向量:m個

  12. #        content        |    變量是結點的內容還是結點的屬性值 向量:m個  

  13. #                            "text"是內容(默認),或者是屬性名稱

  14. #****輸出:只有print,無輸出

  15. #        名稱           |    含義


  16. crawler1<-function(url,xpath,content=rep("text",length(xpath))){

  17.     #如果xpath以及content的數量不同,則輸入數據有誤

  18.     num_url<-length(url)

  19.     if(length(content)!=length(xpath)){

  20.         print("Error:content和xpath向量的數量不一致!")

  21.         return

  22.     } 


  23.     #建立一個num_url行,num_vari列的數據框

  24.     num_vari<-length(xpath)

  25.     result<-data.frame(rep(0,num_url))

  26.     for(i in 2:num_vari){

  27.         cbind(result,rep(0,num_url))

  28.     }

  29.      

  30.     #遍歷url向量,依次對相應網頁進行抓取

  31.     i<-1

  32.     j<-1

  33.     for(i_url in url){

  34.         i_url_parse<-htmlParse(i_url,encoding="UTF-8")#讀取url網頁數據,並使用htmlParse轉化。(xml文件使用xmlParse)

  35.         for(j in 1:num_vari){#依次填充一個頁面中的不同欲讀取的數據值

  36.             node<-getNodeSet(i_url_parse,xpath[j])#通過xpath[i]找到相應變量的xpath結點

  37.             if(length(node)==0){#未爬取到數據,說明xpath有誤

  38.                 result[i,j]<-NA

  39.                 print(paste("注意:第",j,"個變量未能在第",i,"個頁面中找到,我們會把該數據寫爲空值"))

  40.             }else if(length(node)==1){#爬取到一個數據,說明正常

  41.                 if(content[j]=="text"){#欲爬取變量的內容

  42.                     result[i,j]<-xmlValue(node`1`)

  43.                 }else{#欲爬取變量的屬性

  44.                     result[i,j]<-xmlGetAttr(node`1`,content[j])

  45.                     result[i,j]<-iconv(result[i,j],"UTF-8","gbk")#如果是亂碼,可以打開此語句。如果是na可以刪除此句

  46.                 }

  47.             }else{#爬取到多個數據,本函數不予處理

  48.                 result[i,j]<-NA

  49.                 print(paste("注意:第",j,"個變量能在第",i,"個頁面中找到多個,不知您要哪一個,我們會把該數據寫爲空值"))    

  50.             }

  51.         }

  52.         i<-i+1

  53.     }

  54.     result

  55. }


  56. #****函數:(crawler2)

  57. #****概要:網絡抓取的主要函數2,可以抓取n個網頁的1個變量。該xpath可以爬取多個數據,(批量抓取)

  58. #****輸入:

  59. #        名稱           |    數據格式

  60. #        url            |    欲抓取的網站的url                向量:n個

  61. #        xpath          |    給出的抓取變量的xpath            向量:1個

  62. #        content        |    變量是結點的內容還是結點的屬性值 向量:1個  

  63. #                            "text"是內容(默認),或者是屬性名稱

  64. #****輸出:只有print,無輸出

  65. #        名稱           |    含義

  66. #        url            |    1---n自然數,相同url擁有相同數值

  67. #        vari           |    讀取的數據

  68. crawler2<-function(url,xpath,content="text"){

  69.     num_url<-length(url)

  70.     result<-data.frame(url=0,vari=0)

  71.     i<-1#記錄第幾個url

  72.     tmp<-1#

  73.     for(i_url in url){

  74.         i_url_parse<-htmlParse(i_url,encoding="UTF-8")#讀取url網頁數據,並使用htmlParse轉化。(xml文件使用xmlParse)

  75.         node<-getNodeSet(i_url_parse,xpath)#通過xpath[i]找到相應變量的xpath結點

  76.         if(length(node)==0){#未爬取到數據,說明xpath有誤

  77.             result[tmp,1]<-i

  78.             result[tmp,2]<-NA

  79.             print(paste("注意:變量未能在第",i,"個頁面中找到,我們會把該數據寫爲空值"))

  80.             tmp<-tmp+1

  81.         }else{

  82.             for(j in 1:length(node)){

  83.                 result[tmp,1]<-i

  84.                 if(content=="text"){#欲爬取變量的內容

  85.                     result[tmp,2]<-xmlValue(node`j`)

  86.                 }else{#欲爬取變量的屬性

  87.                     result[tmp,2]<-xmlGetAttr(node`j`,content)

  88.                     #result[tmp,2]<-iconv(result[tmp,2],"UTF-8","gbk")#如果是亂碼,可以打開此語句。如果是na可以刪除此句

  89.                 }

  90.                 tmp<-tmp+1

  91.             }

  92.         }

  93.         i<-i+1

  94.     }

  95.     result

  96. }


  97. #test


  98. #測試crawler1

  99. #測試內容

  100. url1<-"http://3c.taobao.com/detail.htm?spm=872.217037.254698.6.deIiSJ&spuid=205341228&cat=1101"

  101. url2<-"http://3c.taobao.com/detail.htm?spm=872.217037.254698.11.deIiSJ&spuid=203228104&cat=1101"

  102. url3<-"http://item.taobao.com/item.htm?spm=1020.3.9.122.SCNhDn&id=15695321398&from="

  103. url<-c(url1,url2,url3)

  104. xpath<-c("//div[@id='idetail']//div[@class='info-area']//div[@class='tlt clearfix']//h1","//div[@id='idetail']//div[@class='info-area']//div[@class='key-info']//span[@class='price']")

  105. crawler1(url,xpath)

  106. #測試屬性值

  107. url<-"http://data.caixin.com/macro/macro_indicator_more.html?id=F0001&cpage=2&pageSize=30&url=macro_indicator_more.html#top";

  108. xpath<-"//meta[@name='keywords']"

  109. content<-"content"

  110. crawler1(url,xpath,content)


  111. #測試crawler2

  112. url<-"http://list.taobao.com/itemlist/bao.htm?spm=567.116925.155171.105.9ZYYMX&cat=50072693&isprepay=1&viewIndex=1&yp4p_page=0&commend=all&atype=b&style=grid&olu=yes&isnew=2&smc=1&mSelect=false&user_type=0&fl=50072693#!cat=50072693&isprepay=1&user_type=0&as=0&viewIndex=1&yp4p_page=0&commend=all&atype=b&style=grid&olu=yes&isnew=2&mSelect=false&smc=1&json=on&tid=0"

  113. xpath<-"//li[@class='list-item list-item-grid']"

  114. content<-"data-commenturl"

  115. crawler2(url1,xpath,content)

  116. #疑難:如何破解data-commenturl="`item`.`commendHref`" 

  117. #<li class="list-item list-item-grid" data-isrush="`item`.`isLimitPromotion`" data-ismall="`item`.`isMall`" data-item="`item`.`itemId`" data-#params="sellerId=`item`.`sellerId`&ip=`extraInfo`.`userIp`" data-comment="`item`.`commend`" data-commenturl="`item`.`commendHref`" data-#virtual="`item`.`isVirtual`">


  118. url2<-"D://r//lab//網頁爬蟲//data//bao.htm"

  119. crawler2(url2,xpath,content)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章