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