小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

爬蟲(chóng)最怕遇到JavaScript依賴性的動(dòng)態(tài)網(wǎng)頁(yè)

 健明 2021-07-14
靜態(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=
很明顯看到,頁(yè)面有一個(gè)表格:

表格內(nèi)容
這些內(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:6function(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)容信息。

沒(méi)有內(nèi)容的html源代碼
第一個(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

關(guān)于phantomjs

學(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)題的。

摸索起來(lái)的代碼是
主要的原因其實(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源代碼里面的信息。

回到了selenium

我的想法是,既然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)階:
推薦閱讀







    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多