網頁爬蟲-R語言實現基本函式
阿新 • • 發佈:2022-05-04
#*************網頁爬蟲-R語言實現,函式庫檔案*******# #****作者:H***************************************# #****版本:v0.1*******************************************# #****時間:2017*************************************# library(XML); #****函式:(crawler1) #****概要:網路抓取的主要函式1,可以抓取n個網頁的m個變數。每個xpath只爬取一個數據,如果大於1個則提示有誤。(精確抓取) #****輸入: # 名稱 | 資料格式 # url | 欲抓取的網站的url 向量:n個 # xpath | 給出的抓取變數的xpath 向量:m個 # content | 變數是結點的內容還是結點的屬性值 向量:m個 # "text"是內容(預設),或者是屬性名稱 #****輸出:只有print,無輸出 # 名稱 | 含義 crawler1<-function(url,xpath,content=rep("text",length(xpath))){ #如果xpath以及content的數量不同,則輸入資料有誤 num_url<-length(url) if(length(content)!=length(xpath)){ print("Error:content和xpath向量的數量不一致!") return } #建立一個num_url行,num_vari列的資料框 num_vari<-length(xpath) result<-data.frame(rep(0,num_url)) for(i in 2:num_vari){ cbind(result,rep(0,num_url)) } #遍歷url向量,依次對相應網頁進行抓取 i<-1 j<-1 for(i_url in url){ i_url_parse<-htmlParse(i_url,encoding="UTF-8")#讀取url網頁資料,並使用htmlParse轉化。(xml檔案使用xmlParse) for(j in 1:num_vari){#依次填充一個頁面中的不同欲讀取的資料值 node<-getNodeSet(i_url_parse,xpath[j])#通過xpath找到相應變數的xpath結點 if(length(node)==0){#未爬取到資料,說明xpath有誤 result[i,j]<-NA print(paste("注意:第",j,"個變數未能在第",i,"個頁面中找到,我們會把該資料寫為空值")) }else if(length(node)==1){#爬取到一個數據,說明正常 if(content[j]=="text"){#欲爬取變數的內容 result[i,j]<-xmlValue(node[[1]]) }else{#欲爬取變數的屬性 result[i,j]<-xmlGetAttr(node[[1]],content[j]) result[i,j]<-iconv(result[i,j],"UTF-8","gbk")#如果是亂碼,可以開啟此語句。如果是na可以刪除此句 } }else{#爬取到多個數據,本函式不予處理 result[i,j]<-NA print(paste("注意:第",j,"個變數能在第",i,"個頁面中找到多個,不知您要哪一個,我們會把該資料寫為空值")) } } i<-i+1 } result } #****函式:(crawler2) #****概要:網路抓取的主要函式2,可以抓取n個網頁的1個變數。該xpath可以爬取多個數據,(批量抓取) #****輸入: # 名稱 | 資料格式 # url | 欲抓取的網站的url 向量:n個 # xpath | 給出的抓取變數的xpath 向量:1個 # content | 變數是結點的內容還是結點的屬性值 向量:1個 # "text"是內容(預設),或者是屬性名稱 #****輸出:只有print,無輸出 # 名稱 | 含義 # url | 1---n自然數,相同url擁有相同數值 # vari | 讀取的資料 crawler2<-function(url,xpath,content="text"){ num_url<-length(url) result<-data.frame(url=0,vari=0) i<-1#記錄第幾個url tmp<-1# for(i_url in url){ i_url_parse<-htmlParse(i_url,encoding="UTF-8")#讀取url網頁資料,並使用htmlParse轉化。(xml檔案使用xmlParse) node<-getNodeSet(i_url_parse,xpath)#通過xpath找到相應變數的xpath結點 if(length(node)==0){#未爬取到資料,說明xpath有誤 result[tmp,1]<-i result[tmp,2]<-NA print(paste("注意:變數未能在第",i,"個頁面中找到,我們會把該資料寫為空值")) tmp<-tmp+1 }else{ for(j in 1:length(node)){ result[tmp,1]<-i if(content=="text"){#欲爬取變數的內容 result[tmp,2]<-xmlValue(node[[j]]) }else{#欲爬取變數的屬性 result[tmp,2]<-xmlGetAttr(node[[j]],content) #result[tmp,2]<-iconv(result[tmp,2],"UTF-8","gbk")#如果是亂碼,可以開啟此語句。如果是na可以刪除此句 } tmp<-tmp+1 } } i<-i+1 } result } #test #測試crawler1 #測試內容 url1<-"http://3c.taobao.com/detail.htm?spm=872.217037.254698.6.deIiSJ&spuid=205341228&cat=1101" url2<-"http://3c.taobao.com/detail.htm?spm=872.217037.254698.11.deIiSJ&spuid=203228104&cat=1101" url3<-"http://item.taobao.com/item.htm?spm=1020.3.9.122.SCNhDn&id=15695321398&from=" url<-c(url1,url2,url3) 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']") crawler1(url,xpath) #測試屬性值 url<-"http://data.caixin.com/macro/macro_indicator_more.html?id=F0001&cpage=2&pageSize=30&url=macro_indicator_more.html#top"; xpath<-"//meta[@name='keywords']" content<-"content" crawler1(url,xpath,content) #測試crawler2 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" xpath<-"//li[@class='list-item list-item-grid']" content<-"data-commenturl" crawler2(url1,xpath,content) #疑難:如何破解data-commenturl="{{item.commendHref}}" #<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