zoukankan      html  css  js  c++  java
  • R语言-Kindle特价书爬榜示例 & 输出HTML小技巧

    20170209更新:

    根据回复提示,rvest包更新,原用函数html作废,需改用read_html

    并后续amazon网页改版等

    因此此文章代码失效!各位可看评论内容了解详情

    等以后有空再重写一遍代码,抱歉。果然代码还是放在github上好啊。。。。

    ----------------------------------

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html

    ----

    自从买了kindle以后,总是想要定期刷有没有便宜的书,amazon经常有些1元/2元的书打特价,但是每次都去刷那些榜单太麻烦了,而且榜单又不能按照价格排名,捞书有点累

    所以自己用R语言的rvest包简单写了一个小程序,让它自动按照不同价格区间把特价书给分出来。

    主要看的是kindle新品排行榜和最快畅销榜。

    销售爬升最快榜: http://www.amazon.cn/gp/movers-and-shakers/digital-text/

    新品榜: http://www.amazon.cn/gp/new-releases/digital-text/

    不在博客园上阅读时才会看到的,这篇博文归http://www.cnblogs.com/weibaar 所有

    仅保证在博客园博客上的排版干净利索还有代码块与图片正确显示,他站请保留作者信息尊重版权啊

    需要预先安装data.table / dplyr / rvest包。

    代码如下

    install.packages("rvest")
    install.packages("data.table")
    install.packages("dplyr")

    主要分享点是:

    1、Rvest的简单应用实例
    2、如何把数据框(data.frame or table) 输出为html文件,即添加html脚本的方法

     1 library(rvest)
     2 library(data.table)
     3 library(dplyr)
     4 #这里是导入网址。研究一下amazon的顺序,直接导入就好
     5 id<-1:5
     6 url_increase_fast<-paste0(
     7         "http://www.amazon.cn/gp/movers-and-shakers/digital-text/ref=zg_bsms_digital-text_pg_",
     8         id,
     9         "?ie=UTF8&pg=",
    10         id)
    11 url_newest<-paste0(
    12         "http://www.amazon.cn/gp/new-releases/digital-text/ref=zg_bsnr_digital-text_pg_",
    13         id,
    14         "?ie=UTF8&pg=",
    15         id)
    16 url<-c(url_increase_fast,url_newest)
    17 #这里编写readdata函数,读取网页内容。里面有些不常用的字段,为了最后导出效果好看,我没全部都导。
    18 #有额外需要的可以自己改编,譬如分类啊,好评率啊等等。对我来说,知道价格、书名就够了
    19 readdata<-function(i){
    20         web<-html(url[i],encoding="UTF-8")
    21         title<-web %>% html_nodes("div.zg_title") %>% html_text()
    22         title_short<-substr(title,1,20)
    23         price<-as.numeric(gsub("","",web %>% html_nodes("div.zg_itemPriceBlock_normal strong.price") %>% html_text()))
    24         ranking_movement<-web %>% html_nodes("span.zg_salesMovement") %>% html_text()
    25         rank_number<-as.numeric(gsub("\.","",web %>% html_nodes("span.zg_rankNumber") %>% html_text()))
    26         #新书榜里没有销售变动记录,所以记为NA
    27         if (length(ranking_movement)==0) {ranking_movement=rep(NA,20)
    28                                           rank_number=rep(NA,20)}
    29         link<-gsub("\
    ","",web %>% html_nodes("div.zg_title a") %>% html_attr("href"))
    30         ASIN<-sapply(strsplit(link,split = "/dp/"),function(e)e[2])
    31         img<-web %>% html_nodes("div.zg_itemImage_normal img")  %>% html_attr("src")
    32         #这里加上html代码
    33         img_link<-paste0("<img src='",img,"'>")
    34         title_link<-paste0("<a href='",link,"'>",title_short,"</a>")
    35         #合并数据
    36         combine<-data.table(img_link,title_link,price,ranking_movement)
    37         setnames(combine,c("图像","书名","价格","销售变动"))
    38         #以防被封IP,设为5秒跑一次数据。
    39         Sys.sleep(5)
    40         combine
    41 }
    42 
    43 #做一个循坏开始跑数
    44 final<-data.table()
    45 for (i in 1:10){
    46         final<-rbind(final,readdata(i))
    47         print(i)
    48 }
    49 
    50 #这里编写一个函数,把data.table转化为html_table#要点请查看w3school,table页,以<table>开始,表头是<th>,行与行之间是<tr>#主要就是sapply, apply,paste的应用啦……就是把数据框先加<td>,再加<tr>,最后外面套一层<table>
    51 transfer_html_table<-function(rawdata){
    52         title<-paste0("<th>",names(rawdata),"</th>")
    53         content<-sapply(rawdata,function(e)paste0("<td>",e,"</td>"))
    54         content<-apply(content,1,function(e) paste0(e,collapse = ""))
    55         content<-paste0("<tr>",content,"</tr>")
    56         bbb<-c("<table border=1><tr>",title,"</tr>",content,"</table>")
    57         bbb
    58 }
    59 #这里应用transfer_html_table函数,把榜单输出为html表格
    60 final_less1<-transfer_html_table(rawdata=final %>% filter(价格<=1))
    61 write(final_less1,"~//Kindle-低于1元特价书.html")
    62 
    63 
    64 final_1_2<-transfer_html_table(rawdata=final %>% filter(价格>1 & 价格<=2))
    65 write(final_1_2,"~//Kindle_1-2元特价书.html")
    66 
    67 final_2_5<-transfer_html_table(rawdata=final %>% filter(价格>2 & 价格<=5))
    68 write(final_2_5,"~//Kindle_2-5元特价书.html")

    最后在我的文档("~//"表示定位到我的文档那里)会找到三个HTML文件,打开来,大概长下面这个样子,于是就可以很愉悦得选书了。Kindle时不时会把一些好书1元贱卖的~~所以有了kindle经常手贱,有这个小脚本之后我觉得我会更加手贱买书了。。。

    如果大家有兴趣,还可以去搜一下R语言批处理、自动运行等文章来看,把这个代码设为定期跑一下,然后让结果能够累计保存。那么以后就知道kindle商城在什么时候调价最多了。 amazon还是比较容易爬虫的,它html页面内代码很规范整洁,除了在产品详情页里,产品描述(product description)总是被脚本保护起来,比较难爬。

    不在博客园上阅读时才会看到的,这篇博文归http://www.cnblogs.com/weibaar 所有

    仅保证在博客园博客上的排版干净利索还有代码块与图片正确显示,他站请保留作者信息尊重版权啊

    以及最近开始学python了!

    大牛分享了一个很好用的python IDE,叫做ANACONDA,里面那个spyder的IDE真的做的很棒~~跟rstudio有的一拼~ 而且ANACONDA集成了python 2.7,都不用单独下python了~~

    然后github上有两个教程写的还蛮不错的

    1、 python入门

    https://github.com/qiwsir/StarterLearningPython

    2、python爬虫101个示例(基于python 3)

    https://github.com/compjour/search-script-scrape

  • 相关阅读:
    关于虚拟机断电导致的 generating /run/initramfs/rdsosreport.txt 问题优秀解决方案
    centos7 yum 阿里源
    startup.bat脚本启动tomcat时,cmd命令窗口闪现问题及Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 错误解决
    Linux 中 Fish Shell
    卸载mysql
    /bin/bash^M: 坏的解释器: 没有那个文件或目录
    elementUI 文本鼠标移入显示太长
    el-upload 手动上传文件
    vue-element-admin 打包测试环境报错
    vue 分页跳转页面详情,返回记住当前点击第几页
  • 原文地址:https://www.cnblogs.com/weibaar/p/4824578.html
Copyright © 2011-2022 走看看