| 所在主题: | |
| 文件名: bookrank.xlsx | |
| 资料下载链接地址: https://bbs.pinggu.org/a-1989267.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、本站为非盈利性质的学术交流网站,鼓励和保护原创作品,拒绝未经版权人许可的上传行为。本站如接到版权人发出的合格侵权通知,将积极的采取必要措施;同时,本站也将在技术手段和能力范围内,履行版权保护的注意义务。 (如有侵权,欢迎举报) |
|
京ICP备16021002号-2 京B2-20170662号
京公网安备 11010802022788号
论坛法律顾问:王进律师
知识产权保护声明
免责及隐私声明