靜態(tài)網(wǎng)站內(nèi)容爬取,rvest、RCurl、XML這幾個(gè)包都可以實(shí)現(xiàn)這個(gè)功能。比如下面的網(wǎng)頁(yè): - http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/xsjj/index.phtml?num=20&p=
這些內(nèi)容都是存放在該網(wǎng)頁(yè)的html源代碼里面,所以爬蟲(chóng)代碼非常簡(jiǎn)單:rm(list = ls()) library(rvest) url <- paste0('http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/xsjj/index.phtml?num=20&p=', 1:6)
trade <- lapply(url,function(x){ html_table(read_html(x), header =T)[[1]] }) trade1 <- do.call(rbind,trade) 對(duì)全部的6個(gè)頁(yè)面,循環(huán)走一下read_html函數(shù)即可,然后使用html_table提取里面的表格,然后綜合起來(lái)。我以前介紹過(guò)的peerJ期刊的爬蟲(chóng)也是如此。當(dāng)然了,這個(gè)循環(huán)會(huì)以為某些url(如果你的url成百上千個(gè))失效而斷掉,所以你其實(shí)是需要加上一個(gè)判斷機(jī)制,所以我修改后的代碼是:library(rvest) url='http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/xsjj/index.phtml?p=' get_tables <- function(url){ fit<-try(web <- read_html(url),silent=TRUE) if('try-error' %in% class(fit)){ cat('HTTP error 404\n') }else{ return(html_table(web) [[1]]) }
} trade=lapply(1:6, function(i){ get_tables(paste0(url,i)) }) trade1 <- do.call(rbind,trade) 但并不是所有的網(wǎng)頁(yè)內(nèi)容都會(huì)顯示在其對(duì)應(yīng)的html源代碼里面,比如局部動(dòng)態(tài)刷新網(wǎng)站。- http://www./plasmid/template/plasmid/plasmid_list.html
可以看到,無(wú)論我們?nèi)绾吸c(diǎn)擊下一頁(yè),雖然網(wǎng)頁(yè)的內(nèi)容一直在修改,但是網(wǎng)頁(yè)的url是不會(huì)變化的,而且使用rvest包根本就讀不到真實(shí)的網(wǎng)頁(yè)內(nèi)容信息。第一個(gè)想法是,使用rvest包模擬一個(gè)瀏覽器請(qǐng)求去訪問(wèn)這個(gè)網(wǎng)頁(yè),第二個(gè)想法是使用其它R包可以訪問(wèn)動(dòng)態(tài)網(wǎng)頁(yè)的,第三個(gè)想法是,使用JavaScript把網(wǎng)頁(yè)交互后的源代碼保存下來(lái),然后去解析里面的信息。關(guān)于局部動(dòng)態(tài)刷新網(wǎng)站這樣的網(wǎng)頁(yè)爬蟲(chóng)的確很難搞,我看到了一個(gè)教程:- https://blog.csdn.net/eastmount/article/details/80088948
但是它使用的是python爬蟲(chóng)的selenium模塊,代碼步驟如下: 1.定位驅(qū)動(dòng):driver = webdriver.Firefox() 2.訪問(wèn)網(wǎng)址:driver.get(url) 3.定位節(jié)點(diǎn)獲取第一頁(yè)內(nèi)容并爬取:driver.find_elements_by_xpath() 4.獲取“下一頁(yè)”按鈕,并調(diào)用click()函數(shù)點(diǎn)擊跳轉(zhuǎn) 5.爬取第2頁(yè)的網(wǎng)站內(nèi)容:driver.find_elements_by_xpath() 其核心步驟是獲取“下一頁(yè)”按鈕,并調(diào)用Selenium自動(dòng)點(diǎn)擊按鈕技術(shù),從而實(shí)現(xiàn)跳轉(zhuǎn),之后再爬取第2頁(yè)內(nèi)容。但是,我沒(méi)有時(shí)間去學(xué)習(xí)python了,而且python爬蟲(chóng)本來(lái)就是另外一個(gè)大的學(xué)習(xí)方向。本來(lái)準(zhǔn)備是求助一個(gè)python大神,但是想了想開(kāi)不了口,我好歹也是一方風(fēng)云人物。唉,只好硬著頭皮繼續(xù)上。接下來(lái)測(cè)試使用JavaScript把網(wǎng)頁(yè)交互后的源代碼保存下來(lái),然后去解析里面的信息。- https://zhuanlan.zhihu.com/p/24772389
學(xué)起來(lái)也是一個(gè)大工程:https:///- https:///quick-start.html
- https://javascript./tool/phantomjs.html
- https://mp.weixin.qq.com/s/mGwm-rAdwyr63l8mv0l_DQ
需要了解的是webpage模塊是PhantomJS的核心模塊,用于網(wǎng)頁(yè)操作。所以標(biāo)準(zhǔn)代碼頭部如下:var webPage = require('webpage'); var page = webPage.create(); 我略微思考,寫(xiě)出來(lái)了下面的代碼,因?yàn)椴粫?huì)JavaScript,所以這個(gè)代碼其實(shí)是有問(wèn)題的。主要的原因其實(shí)是phantomjs打開(kāi)的網(wǎng)頁(yè),仍然不是最終的HTML源代碼,雖然是可以使用 page.content保存那個(gè)HTML源代碼,但是并不能解析獲取里面的“下一頁(yè)”去點(diǎn)擊它。有意思的是我看到了PhantomJS從入門(mén)到放棄,https://www.jianshu.com/p/8210a17bcdb8最后本來(lái)是準(zhǔn)備按照url規(guī)律都保存為html網(wǎng)頁(yè)文件看了看,總共是33951 個(gè)記錄 plasmid,但是很明顯ID過(guò)界了。不過(guò)這個(gè)并不是重點(diǎn):- http://www./plasmid/template/plasmid/plasmid_detail.html?id=39983
- http://www./plasmid/template/plasmid/plasmid_detail.html?id=39982
- http://www./plasmid/template/plasmid/plasmid_detail.html?id=39979
關(guān)鍵是 phantomjs 仍然是拿不到里面的信息:var webPage = require('webpage'); var page = webPage.create();
var fs = require('fs'); var path = 'test.html'
page.open('http://www./plasmid/template/plasmid/plasmid_detail.html?id=39983', function (status) { var content = page.content; fs.write(path,content,'w') phantom.exit(); }); 即使我暴力循環(huán)10000到99999的全部ID,仍然是拿不到里面真正的HTML源代碼里面的信息。我的想法是,既然python爬蟲(chóng)的selenium模塊可以做到,R里面也應(yīng)該是有selenium類(lèi)似的,略微搜索,居然真的有!我花了半個(gè)小時(shí)學(xué)了一下selenium的R代碼實(shí)現(xiàn)方式,就解決了這個(gè)問(wèn)題。明天分享這個(gè)解決過(guò)程,預(yù)計(jì)會(huì)出4個(gè)教程。效果如下:是不是很精彩!感興趣的可以參加我們的入門(mén)課程,雖然不會(huì)講解這個(gè)爬蟲(chóng),但是會(huì)有一系列的學(xué)習(xí)經(jīng)驗(yàn)分享哦!
文末友情宣傳強(qiáng)烈建議你推薦我們生信技能樹(shù)給身邊的博士后以及年輕生物學(xué)PI,幫助他們多一點(diǎn)數(shù)據(jù)認(rèn)知,讓科研更上一個(gè)臺(tái)階:
|