#lab1
html
library(XML);
node
url1<-"http://data.caixin.com/macro/macro_indicator_more.html?id=F0001&cpage=2&pageSize=30&url=macro_indicator_more.html#top";
json
url<-htmlParse(url1,encoding="UTF-8")#把html文件讀入r語言中並解析
網頁爬蟲
#找結點
網絡
test <- getNodeSet(url,'//meta[@name]')#xpath語法找到html部件#顯示的中文正常
app
#讀取結點的內容:xmlValue內部參數只能是一個字符串
ide
test_text_list<-sapply(test, xmlValue)#提取內容,多個的化以向量形式存儲
函數
test_text<-xmlValue(test`2`)#把test的第2箇中的內容提取出來=test_text_list[2].注意,即時test只有一組數據也要使用test`1`,不能夠直接使用test(不是字符串)
測試
#讀取結點的屬性:xmlGetAttr內部參數只能是一個字符串
網站
content1<-xmlGetAttr(test`1`, "content")#讀取test`1`中的content內容。注意直接用test不能夠。#顯示的中文不正常
content1<-iconv(content1,"UTF-8","gbk")#解決中文正常顯示問題
#lab2使用R語言爬取淘寶網站的筆記本商品價格和名稱
library(XML);
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"
read_taobao<-function(url){
name_text<-""
price_text<-""
i<-1
for(i_url in url){
i_url2<-htmlParse(i_url,encoding="UTF-8")#讀取html數據
name<- getNodeSet(i_url2,"//div[@id='idetail']//div[@class='info-area']//div[@class='tlt clearfix']//h1")#經過xpath找到網頁中的name
#xpath://任意位置的 @是屬性
name_text_tmp<-xmlValue(name`1`)#提取name的內容
price<-getNodeSet(i_url2,"//div[@id='idetail']//div[@class='info-area']//div[@class='key-info']//span[@class='price']")#經過xpath找到網頁中的price
price_text_tmp<-xmlValue(price`1`)#提取price的內容
name_text[i]<-name_text_tmp
price_text[i]<-price_text_tmp
i<-i+1
}
data.frame(name=name_text,price=price_text)
}
url<-c(url1,url2)
read_taobao(url)
複製代碼
http://www.bassary.com/?p=1107
#*************網頁爬蟲-R語言實現,函數庫文件*******#
#****做者:oldlee11***************************************#
#****版本:v0.1*******************************************#
#****時間:2012-11-14*************************************#
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[i]找到相應變量的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[i]找到相應變量的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`">
url2<-"D://r//lab//網頁爬蟲//data//bao.htm"
crawler2(url2,xpath,content)