搜索
人大经济论坛 附件下载

附件下载

所在主题:
文件名:  kindle排行榜.txt
资料下载链接地址: https://bbs.pinggu.org/a-1989262.html
附件大小:
最近学习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")


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





    熟悉论坛请点击新手指南
下载说明
1、论坛支持迅雷和网际快车等p2p多线程软件下载,请在上面选择下载通道单击右健下载即可。
2、论坛会定期自动批量更新下载地址,所以请不要浪费时间盗链论坛资源,盗链地址会很快失效。
3、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。
(如有侵权,欢迎举报)
二维码

扫码加我 拉你入群

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

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

GMT+8, 2026-1-3 21:15