全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
3951 4
2016-03-11
      最近学习R语言爬虫,通过一个博客上相关代码的学习进行联系,博客链接:http://supstat.com.cn/blog/2015/03/31/amazon-kindle/        源代码只抓取了收费电子书的排行榜,如存在缺失平均分的条目则会导致错位,同时还存在其他的一些问题,在学习过程中,对代码进行了改进,和大家分享下~

首先是涉及的包:
library(xlsxjars)
library(rJava)
library(xlsx)
library(XML)

URL <- paste0("http://www.amazon.cn/gp/bestsellers/digital-text/116169071/ref=zg_bs_116169071_pg_",1:5,
              "?ie=UTF8&pg=",1:5,"&ajax=",1:5)
URL[1] <- "http://www.amazon.cn/gp/bestsellers/digital-text/116169071/ref=sa_menu_kindle_l3_116169071#1"


#############################################################################
URL[1]更换是因为,第一页的时候如果和其他页结构一样,只能抓取到六条数据;另外如果采用
URL <- paste0("http://www.amazon.cn/gp/bestsellers/digital-text/116169071/ref=sa_menu_kindle_l3_116169071#",1:5)
则只能抓取5次第一页的数据,大家可以注意下,如果在网页输入
http://www.amazon.cn/gp/bestsellers/digital-text/116169071/ref=sa_menu_kindle_l3_116169071#2,亚马逊是先跳到第一页,然后才转接到第二页的。
############################################################################


##################抓取信息相关函数准备###########################################

#抓取序号
giveRanks = function(rootNode){
  ranks <- xpathSApply(rootNode,"//span[@class='zg_rankNumber']",xmlValue)
  ranks <- as.numeric(sub("\\.","",ranks))
  return(ranks)
}

#抓取书名
giveNames = function(rootNode){
  names <- xpathSApply(rootNode,"//div[@class='zg_title']",xmlValue)
  return(names)
}

#抓取作者
giveAuthors = function(rootNode){
  authors <- xpathSApply(rootNode,"//div[@class='zg_byline']",xmlValue)
  authors <- sub("\n\n\n\n\n\n\n~ ","",authors) #去掉不需要的部分
  return(authors)
}

#抓取平均分并处理为数值形式,
giveRate = function(rootNode){
  rate <- xpathSApply(rootNode,"//div[@class='zg_reviews']",xmlValue)
  rate1 <- strsplit(rate,"平均")
  rate1 <- sapply(rate1, function(v) return(v[2]))
  rate1 <- substr(rate1,1,3)
  rate <- as.numeric(rate1)
  return(rate)
}

#抓取参评人数
giveNumber = function(rootNode){
  number <- xpathSApply(rootNode,"//div[@class='zg_reviews']",xmlValue)
  number1 <- strsplit(number,"\\(")
  #上述语句提取信息较多,考虑到数字两侧有括号,取左侧括号作为分隔符拆分为两列,再取第二列处理
  number1 <- sapply(number1, function(v) return(v[2]))
  number1 <- sub(")\n  \n\n\n\n\n\n\n\n\n\n\n\n","",number1)
  number1 <- sub(",","",number1) #去掉数字中的“,”,方可转化为数字
  number <- as.numeric(number1)
  return(number)
}

#平均分与参评人数是通过抓取整条数据再拆分的方式进行,从而可以识别出没有评分的书籍

#抓取价格
givePrice = function(rootNode){
  price <- xpathSApply(rootNode,"//strong[@class='price']",xmlValue)
  price <- as.numeric(sub("免费","0",sub("¥ ","",price)))[1:40]
  price
}

##############################################################################

#抓取信息用的是xpath的相关语法,大家可以通过网址:http://www.w3school.com.cn/xpath/xpath_syntax.asp 进一步学习其他的语法。
##############################################################################

# 抓取全部信息并汇总成数据表
getAmazonBy1 = function(URL){
  Sys.sleep(runif(1,1,2))
  doc <- htmlParse(URL,encoding="UTF-8")
  rootNode <- xmlRoot(doc)
  Ranks <- giveRanks(rootNode)
  Name <- giveNames(rootNode)
  Author <- giveAuthors(rootNode)
  Price <- givePrice(rootNode)
  Rate <- giveRate(rootNode)
  Number <- giveNumber(rootNode)
  data <- data.frame(Ranks,Name,Author,Price,Rate,Number)
  return(data)
}


####################主程序##########################################
mainfunction = function(URL){
  data <- rbind(
    getAmazonBy1(URL[1]),
    getAmazonBy1(URL[2]),
    getAmazonBy1(URL[3]),
    getAmazonBy1(URL[4]),
    getAmazonBy1(URL[5]))
  return(data)
}


##############################################################################
data <- mainfunction(URL)
write.xlsx(data,"f:/bookrank.xlsx")


附件是代码和今天刚跑出的数据,和大家分享下



附件列表

bookrank.xlsx

大小:18.23 KB

 马上下载

3.11跑出的数据

kindle排行榜.txt

大小:2.69 KB

 马上下载

代码

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2016-3-11 21:31:27
大神,,果断收藏~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-3-11 21:39:55
顶顶顶~~~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-3-11 22:33:10
[em17]
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2016-3-14 00:15:56
DING, XIE XIE.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群