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("\\\n","",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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM