前幾期簡單介紹了一系列R爬蟲的基礎(chǔ)知識(shí)、核心R包以及一些輔助工具畦幢,其中,基礎(chǔ)知識(shí)包括R爬蟲必備基礎(chǔ)——HTML和CSS初識(shí)宇葱,R爬蟲必備基礎(chǔ)——靜態(tài)網(wǎng)頁+動(dòng)態(tài)網(wǎng)頁,R爬蟲必備基礎(chǔ)—HTTP協(xié)議和R爬蟲必備基礎(chǔ)—?jiǎng)討B(tài)異步加載黍瞧;核心R包包括R爬蟲必備——rvest包的使用诸尽,R爬蟲必備基礎(chǔ)—rvest為什么不用于動(dòng)態(tài)網(wǎng)頁您机?,R爬蟲必備—httr+POST請(qǐng)求類爬蟲(網(wǎng)易云課堂),R爬蟲必備——httr+GET請(qǐng)求類爬蟲(解螺旋課程)被碗;輔助工具包括R爬蟲必備基礎(chǔ)——CSS+SelectorGadget某宪,R爬蟲必備基礎(chǔ)—Chrome開發(fā)者工具(F12)。今天呢兴喂,通過爬取PubMed實(shí)戰(zhàn)案例來進(jìn)一步鞏固前期所學(xué)。
爬取目的
當(dāng)要開展某個(gè)領(lǐng)域的研究時(shí)衣迷,需要檢索查看下該領(lǐng)域都研究了什么。通過pubmed檢索后文章可能非常多壶谒,這個(gè)時(shí)候不可能每篇都通讀云矫,通常都是先看下摘要汗菜,然后再選擇感興趣的進(jìn)行全文查閱。為了避免一篇篇在線點(diǎn)擊查閱陨界,也不便于做記錄巡揍,可以將該領(lǐng)域文章的基本信息(包括摘要內(nèi)容)爬取下來菌瘪,然后本地查看俏扩,最后通過PMID號(hào)下載感興趣全文。下面录淡,將以lncRNA為關(guān)鍵詞,爬取2020年發(fā)表的綜述類文章的題目赁咙、PMID號(hào)、作者彼水、發(fā)表雜志崔拥、摘要等信息链瓦。
網(wǎng)頁分析
首先打開網(wǎng)站,輸入lncRNA關(guān)鍵詞,選擇review渤刃,然后時(shí)間限制在2020年,option選擇Abstract贴膘,得到如下檢索界面,網(wǎng)址為:https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=pubt.review&filter=years.2020-2020&format=abstract刑峡,這為第一條信息,共計(jì)顯示10條記錄突梦。從下圖我們知道該網(wǎng)頁是個(gè)帶有Query String Parameters 參數(shù)的GET類請(qǐng)求。
共計(jì)有390條信息宫患,需要完全獲取該怎么辦?先嘗試點(diǎn)擊more后娃闲,發(fā)現(xiàn)展示了page2(共計(jì)10條),將鼠標(biāo)往下拉畜吊,網(wǎng)址會(huì)添加&page=2,最終網(wǎng)址:https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=pubt.review&filter=years.2020-2020&format=abstract&page=2玲献,Ctrl+R刷新開發(fā)工具后臺(tái)殉疼,預(yù)覽的結(jié)果是11-20條捌年。按照如此規(guī)律,就可以構(gòu)建有規(guī)律的網(wǎng)址礼预,如下所示。共計(jì)390條記錄托酸,每頁顯示10條,那需要39頁励堡。按照這個(gè)思路就可以爬取所有信息。
https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=pubt.review&filter=years.2020-2020&format=abstract
https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=pubt.review&filter=years.2020-2020&format=abstract&page=2
https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=pubt.review&filter=years.2020-2020&format=abstract&page=3
https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=pubt.review&filter=years.2020-2020&format=abstract&page=4
https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=pubt.review&filter=years.2020-2020&format=abstract&page=5
https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=pubt.review&filter=years.2020-2020&format=abstract&page=6
...
https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=pubt.review&filter=years.2020-2020&format=abstract&page=39
但是应结,還有另一種方式泉唁,回到首頁,打開開發(fā)后臺(tái)揩慕,定位到XHR面板。然后點(diǎn)擊more迎卤,一直more,注意這個(gè)過程不要刷新頁面****止吐,發(fā)現(xiàn)XHR面板上每點(diǎn)擊一次more侨糟,就會(huì)生成一個(gè)more碍扔,同時(shí)你主網(wǎng)頁網(wǎng)址維持不變秕重。這是個(gè)典型的通過more達(dá)到異步加載的目的。
查看這幾個(gè)more的Headers信息溶耘,會(huì)發(fā)現(xiàn)明顯的規(guī)律(如下所示),都是向https://pubmed.ncbi.nlm.nih.gov/more/發(fā)起請(qǐng)求凳兵,通過POST提交表單信息,只要修改page即可庐扫,按照這個(gè)思路也可以爬取所有文章信息饭望。需要注意的是形庭,這種動(dòng)態(tài)加載的POST請(qǐng)求類爬蟲是從第二頁開始的。
爬蟲策略
第一種策略
構(gòu)建有規(guī)律的網(wǎng)址【https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=pubt.review&filter=years.2020-2020&page=頁碼】 萨醒,共計(jì)390條記錄,每頁顯示10條富纸,那需要39頁,可以按照這個(gè)思路進(jìn)行爬取晓褪,這里它屬于一種GET請(qǐng)求類爬蟲。對(duì)于這類爬蟲辞州,有以下幾種爬取方式:
- 方法一:rvest怔锌,不推薦,之前有專門有推文說過原因涝涤。爬取少量的確也能成功,但很容易被封阔拳。
- 方法二:httr+rvest組合(推薦),httr解決網(wǎng)絡(luò)請(qǐng)求問題类嗤,rvest解決網(wǎng)頁解析和信息提取。
- 方法三:RCurl+XML組合遗锣,RCurl解決網(wǎng)絡(luò)請(qǐng)求問題,XML解決網(wǎng)頁解析和信息提取精偿。
第二種策略
根據(jù)more發(fā)起的動(dòng)態(tài)加載,構(gòu)建有規(guī)律的POST請(qǐng)求笔咽,也可以進(jìn)行爬取搔预,這里它屬于一種POST請(qǐng)求類爬蟲叶组。對(duì)于這類爬蟲,主要有以下兩種爬取方式:
- 方法一:httr+rvest組合(推薦)甩十,httr解決網(wǎng)絡(luò)請(qǐng)求問題,rvest解決網(wǎng)頁解析和信息提取枣氧。
- 方法二:RCurl+XML組合溢十,RCurl解決網(wǎng)絡(luò)請(qǐng)求問題达吞,XML
今天呢,先介紹第一種爬取策略的方法二:httr+rvest組合酪劫。
rm(list=ls())
#加載所需要的R包,沒安裝的提前安裝
library("httr")
library("magrittr")
library("rvest")
library("xml2")
library("stringr")
#首先構(gòu)造第一頁的url
url <- c('https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=pubt.review&filter=years.2020-2020&format=abstract')
#構(gòu)造請(qǐng)求提交信息覆糟,根據(jù)Request headers的內(nèi)容填寫。
mycookie <- 'ncbi_sid=CE8CCD5EEB3B8391_1825SID; _ga=GA1.2.284594426.1588836424; entrezSort=pubmed:; MyNcbiSigninPreferences=O25jYmlscyY%3D; WebCubbyUser=UFSJUQUQPJOPNU17DZHC79N0PN7V14ZM%3Blogged-in%3Dtrue%3Bmy-name%3Dyuanjiuyun%3Bpersistent%3Dtrue%40CE8CCD5EEB3B8391_1825SID; labs-pubmed-csrftoken=xKN3RWUpM9RzswSjmTAC4JiUbvWAqrtcAg0HGZHagClqGImTVx95DdMmRl117GHI; pmc.article.report=; _gid=GA1.2.1075622582.1592800677; sessionid=cwuommk94ngosh06896fslsck0ezxmb6; pm_ncbi_alert_dismiss=nCoV; pm-sid=U_VuaPR2IXwdvtAlIoP3EQ:bac28257745cb37e186420a3d2058fb9; pm-adjnav-sid=yWapb_Ia32GrozOuqYVerQ:54e8575844b60ed67d1216e4ff365989; pm-iosp=; ncbi_pinger=N4IgDgTgpgbg+mAFgSwCYgFwgCwE4BCAIgAykCM+AbAKzaHYBi1ppATPgwMysDsx2rAMKdCAOjKiAtnDJkQAGhABXAHYAbAPYBDVCqgAPAC6ZQrTOCUAjSVHSLO5sFZt2c5gM5QtEAMaJo7kpqxorU5gogsuZyiqzE5nhELBQ0dIzMLOxcvPxCIuJSMjEgrHJYTta2GBUuGJ7efgFBhhgAcgDyrQCiEaxm5c62oio+lsjDapLDyIiiAOYaML240dSclBGc8VgAHJTYm2WRaxv2/SA7rAf2DlgAZlpqnpsHWIYQSlCbO+H2K7vYHisH6KbDbC5A1grUG3EDEURQ0TxUGvZTqbS6AwhHBhLDFNbmSiUMyhVGQiLUDZYZEgag8cw0yhHMiUYjQkBEjxeXyIEAAXz5QA'
#注意比較,保留不變的參數(shù)
myheaders <- c('accept' ='text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'accept-encoding' = 'gzip, deflate, br',
'accept-language' = 'zh-CN,zh;q=0.9',
'user-agent' = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
'referer'= 'https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=years.2020-2020&format=abstract'
)
#構(gòu)造請(qǐng)求頭參數(shù)信息滩字,根據(jù)Query String Parameters內(nèi)容填寫
mypayload <- list("term" = "lncRNA",
"filter" = "pubt.review",
"filter"= "years.2020-2020",
"format" = "abstract")
#執(zhí)行第一頁,httr的GET函數(shù)
response <- GET(url = url, add_headers(.headers = myheaders), set_cookies(.cookies =mycookie),timeout(30),query = mypayload)
#讀入并解析網(wǎng)頁內(nèi)容
web <- read_html(response, encoding ="utf-8")
paper_inf <- data.frame()
#提取文章題目
paper_title <- web %>% html_nodes("div.full-view h1.heading-title a") %>% html_text() %>% str_replace_all(" ","") %>%str_replace_all("\n","")
#提取文章PMID號(hào)
paper_PMID <- web %>% html_nodes("ul.identifiers li span.pubmed strong.current-id") %>% html_text()
paper_PMID <- paper_PMID[seq(2,length(paper_PMID),2)]
#提取發(fā)表的雜志
paper_journal <- web %>% html_nodes("div.journal-actions button") %>% html_attr("title")
paper_journal <- paper_journal[seq(2,length(paper_journal),2)]
#提取文章摘要
paper_abstract <- web %>% html_nodes("div.abstract div.selected") %>% html_text() %>% str_replace_all("\n","") %>% str_replace_all(" ","")
#提取文章作者
paper_author <- web %>% html_nodes("div.authors-list") %>% html_text() %>% str_replace_all("\n","") %>% str_replace_all(" ","") %>% str_replace_all("(\u00A0)","")
paper_author <- paper_author[seq(2,length(paper_author),2)]
#創(chuàng)建數(shù)據(jù)框存儲(chǔ)以上信息
papers <- data.frame(paper_title,paper_author,paper_journal,paper_abstract,paper_PMID)
paper_inf <- rbind(paper_inf,papers)
#接下來御吞,利用循環(huán),從第二頁開始
for (i in 2:5){
#首先構(gòu)造第一頁的url
url <- c('https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=pubt.review&filter=years.2020-2020&format=abstract')
#構(gòu)造請(qǐng)求提交信息漓藕,根據(jù)Request headers的內(nèi)容填寫。
mycookie <- 'ncbi_sid=CE8CCD5EEB3B8391_1825SID; _ga=GA1.2.284594426.1588836424; entrezSort=pubmed:; MyNcbiSigninPreferences=O25jYmlscyY%3D; WebCubbyUser=UFSJUQUQPJOPNU17DZHC79N0PN7V14ZM%3Blogged-in%3Dtrue%3Bmy-name%3Dyuanjiuyun%3Bpersistent%3Dtrue%40CE8CCD5EEB3B8391_1825SID; labs-pubmed-csrftoken=xKN3RWUpM9RzswSjmTAC4JiUbvWAqrtcAg0HGZHagClqGImTVx95DdMmRl117GHI; pmc.article.report=; _gid=GA1.2.1075622582.1592800677; sessionid=cwuommk94ngosh06896fslsck0ezxmb6; pm_ncbi_alert_dismiss=nCoV; pm-sid=U_VuaPR2IXwdvtAlIoP3EQ:bac28257745cb37e186420a3d2058fb9; pm-adjnav-sid=yWapb_Ia32GrozOuqYVerQ:54e8575844b60ed67d1216e4ff365989; pm-iosp=; ncbi_pinger=N4IgDgTgpgbg+mAFgSwCYgFwgCwE4BCAIgAykCM+AbAKzaHYBi1ppATPgwMysDsx2rAMKdCAOjKiAtnDJkQAGhABXAHYAbAPYBDVCqgAPAC6ZQrTOCUAjSVHSLO5sFZt2c5gM5QtEAMaJo7kpqxorU5gogsuZyiqzE5nhELBQ0dIzMLOxcvPxCIuJSMjEgrHJYTta2GBUuGJ7efgFBhhgAcgDyrQCiEaxm5c62oio+lsjDapLDyIiiAOYaML240dSclBGc8VgAHJTYm2WRaxv2/SA7rAf2DlgAZlpqnpsHWIYQSlCbO+H2K7vYHisH6KbDbC5A1grUG3EDEURQ0TxUGvZTqbS6AwhHBhLDFNbmSiUMyhVGQiLUDZYZEgag8cw0yhHMiUYjQkBEjxeXyIEAAXz5QA'
#注意比較,保留不變的參數(shù)
myheaders <- c('accept' ='text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'accept-encoding' = 'gzip, deflate, br',
'accept-language' = 'zh-CN,zh;q=0.9',
'user-agent' = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
'referer'= 'https://pubmed.ncbi.nlm.nih.gov/?term=lncRNA&filter=years.2020-2020&format=abstract')
#構(gòu)造請(qǐng)求頭參數(shù)信息享钞,根據(jù)Query String Parameters內(nèi)容填寫
mypayload <- list("term" = "lncRNA",
"filter" = "pubt.review",
"filter"= "years.2020-2020",
"format" = "abstract",
"page" = i)
#執(zhí)行第一頁,httr的GET函數(shù)
response <- GET(url = url, add_headers(.headers = myheaders),set_cookies(.cookies =mycookie),timeout(30),query = mypayload)
#讀入并解析網(wǎng)頁內(nèi)容
web <- read_html(response, encoding ="utf-8")
#提取文章題目
paper_title <- web %>% html_nodes("div.full-view h1.heading-title a") %>% html_text() %>% str_replace_all(" ","") %>%str_replace_all("\n","")
#提取文章PMID號(hào)
paper_PMID <- web %>% html_nodes("ul.identifiers li span.pubmed strong.current-id") %>% html_text()
paper_PMID <- paper_PMID[seq(2,length(paper_PMID),2)]
#提取發(fā)表的雜志
paper_journal <- web %>% html_nodes("div.journal-actions button") %>% html_attr("title")
paper_journal <- paper_journal[seq(2,length(paper_journal),2)]
#提取文章摘要
paper_abstract <- web %>% html_nodes("div.abstract div.selected") %>% html_text() %>% str_replace_all("\n","")
#提取文章作者
paper_author <- web %>% html_nodes("div.authors-list") %>% html_text() %>% str_replace_all("\n","") %>% str_replace_all(" ","") %>% str_replace_all("(\u00A0)","")
paper_author <- paper_author[seq(2,length(paper_author),2)]
#創(chuàng)建數(shù)據(jù)框存儲(chǔ)以上信息
papers <- data.frame(paper_title,paper_author,paper_journal,paper_abstract,paper_PMID)
paper_inf <- rbind(paper_inf,papers)
}
#將數(shù)據(jù)寫入csv文檔
write.csv(paper_inf, file="paper_lncRNA_revew_2020.csv")
運(yùn)行結(jié)束后,共計(jì)獲取390條信息暑脆,內(nèi)容如下:
以上代碼主要是為了展示httr+rvest這類組合如何完成GET請(qǐng)求類爬蟲,整體代碼是比較簡單粗糙的狐肢,沒有添加訪問出錯(cuò)時(shí)的應(yīng)對(duì)方式,也沒有設(shè)置代理池处坪,且訪問速度也不是很快,應(yīng)付少量的文章爬取還是OK的同窘。如果有小伙伴,的確有整理匯總Pubmed文章信息的需求想邦,可以直接從官網(wǎng)上導(dǎo)出即可。新版PubMed可以提供一次性導(dǎo)出(10000條信息以內(nèi))委刘,具體方法,根據(jù)自身要求設(shè)置篩選條件后锡移,點(diǎn)擊save,選擇All results即可淆珊。
結(jié)果如下圖所示夺饲,內(nèi)容很多施符,但卻沒有文章摘要信息,仍是美中不足(雖然網(wǎng)站是可以導(dǎo)出摘要信息的戳吝,但為txt文本格式,不直觀)听哭。所以慢洋,爬蟲在一定程度上來說還是有用的。
當(dāng)爬取到這些文章的基本信息后普筹,可以本地查閱每篇文章的主要內(nèi)容。對(duì)于看英文有困難斑芜,可以將其翻譯成中文肩刃。將輸出的文章信息修改成xls格式杏头,然后打開https://translate.yandex.com/doc,將文件上傳上去即可全文翻譯醇王。
往期回顧
R爬蟲在工作中的一點(diǎn)妙用
R爬蟲必備基礎(chǔ)——HTML和CSS初識(shí)
R爬蟲必備基礎(chǔ)——靜態(tài)網(wǎng)頁+動(dòng)態(tài)網(wǎng)頁
R爬蟲必備——rvest包的使用
R爬蟲必備基礎(chǔ)——CSS+SelectorGadget
R爬蟲必備基礎(chǔ)—Chrome開發(fā)者工具(F12)
R爬蟲必備基礎(chǔ)—HTTP協(xié)議
R爬蟲必備—httr+POST請(qǐng)求類爬蟲(網(wǎng)易云課堂)
R爬蟲必備基礎(chǔ)—rvest為什么不用于動(dòng)態(tài)網(wǎng)頁?
R爬蟲必備——httr+GET請(qǐng)求類爬蟲(解螺旋課程)