国自然基因的爬取最初是由于工作需求,需要整理汇总相关的国自然信息,方便定位科研热点。早期,主要通过比较机械的方式,关键词检索——肉眼选择所有信息——然后复制粘贴,相当费时间。当然,很多公共号也会整理汇总提供,但大多需要发朋友圈之类的操作。通过R爬虫就可以快速获取国自然信息,大大提高效率,以前可能需要2-3天才能完成,而爬虫几分钟就可以解决这个事情。
国自然信息来源
我们知道爬虫就是能提取网页上的可见信息,只要看得见,理论上爬虫就可以获取。因此,要爬取国自然信息,需要知道它们的来源网站,经检索主要有以下几种:
1-国家自然科学基金委员会
网址:https://isisn.nsfc.gov.cn/egrantindex/funcindex/prjsearch-list
该网站是官网来源,它的检索设置非常细化,不能通过一次性获得宽泛的检索结果;同时涉及多次验证码,因此对爬虫并不友好。简单检索信息可以,想要爬取获取信息,不推荐该网站。当然对于爬虫大牛来说,这些都不是障碍。
2-国家自然科学基金结果查询- NSFC
网址:http://nsfc.biomart.cn/
丁香通提供的检索平台,该平台收录信息更新不及时,目前还停留在2015,直接pass吧。但该网站提供有丰富的国自然标书资源,不知道能不能爬虫,哈哈哈。
3-medsci
网址 : https://www.medsci.cn/sci/nsfc.do
该网站可以忽略,收录的信息很不全面。
4-科学网
网址:http://fund.sciencenet.cn/
该网站检索设置不复杂,可以通过简单关键词获取足够多的信息,且没有验证码设置,对爬虫友好。但是呢,该网站在任一关键词检索下只提供200条信息的展示,信息不全面。重点是,现在居然收费了!还是直接pass吧。
5-国家自然基金项目查询(V2.0正式版)
网址:http://fund.zsci.com.cn/
强烈推荐该网站用于国自然信息爬取,网站检索设置不复杂,可以通过简单关键词获取足够多的信息,且没有验证码设置。同时,信息显示全面,是爬取国自然信息的最佳选择!
如何爬取国自然信息?
下面抛出这样一个要求:如何爬取2016-2019年间lncRNA相关的基金项目?
首先,打开网页http://fund.zsci.com.cn/,输入关键词,如下所示:
得到如下检索界面,共计得到1200多条信息,每条信息包括题目、负责人、申请单位、研究类型、金额等信息。
分析网址规律,发现按照网址有三部分组成:[http://fund.zsci.com.cn/Index/index/title/lncRNA/start_year/2016/end_year/2019/xmid/0/search/1/p/]+[页码]+[.html]
http://fund.zsci.com.cn/Index/index/title/lncRNA/start_year/2016/end_year/2019/xmid/0/search/1/p/1.html
http://fund.zsci.com.cn/Index/index/title/lncRNA/start_year/2016/end_year/2019/xmid/0/search/1/p/2.html
http://fund.zsci.com.cn/Index/index/title/lncRNA/start_year/2016/end_year/2019/xmid/0/search/1/p/3.html
http://fund.zsci.com.cn/Index/index/title/lncRNA/start_year/2016/end_year/2019/xmid/0/search/1/p/4.html
.......
http://fund.zsci.com.cn/Index/index/title/lncRNA/start_year/2016/end_year/2019/xmid/0/search/1/p/lastpage_number.html
接下来,正式进行爬取~~~
- 安装加载相应的R包
rm(list = ls())
library(rvest)
library(stringr)
- 针对第一页进行信息抓取
url1 <- c("http://fund.zsci.com.cn/Index/index/title/lncRNA/start_year/2016/end_year/2019/xmid/0/search/1/p/1.html")
web <- read_html(url1)
#---获得基金标题---
Title <- web %>% html_nodes('ul a li h3') %>% html_text() # 标题内容解析
Title
#---获得众多信息---
Information <- web %>% html_nodes('ul a li span') %>% html_text() #获取了负责人和单位信息
Information
#---获取负责人信息---
Author <- Information[grep("负责人", Information)]
Author
#---获得申请单位---
Department <- Information[grep("申请单位", Information)]
Department
#---获取研究类型---
jijintype <- Information[grep("研究类型", Information)]
jijintype
#---获得项目号---
Project <- Information[grep("项目批准号", Information)]
Project
#---获取批准时间---
Date <- Information[grep("批准年度", Information)]
Date
#---获取基金金额---
Money <- Information[grep("金额", Information)]
Money
result <- data.frame(Title=Title,Author=Author,Department=Department,
Type=jijintype,Project=Project,Date=Date,Money=Money)
- 获取所有页面信息,那该检索条件下最大页码是多少?先获取最大页码数(当然可以直接点击最后一页获取相应页码)
#进入总网页第一页
url1<-"http://fund.zsci.com.cn/Index/index/title/lncRNA/start_year/2016/end_year/2019/xmid/0/search/1/p/1.html"
#读取网页内容
web <- read_html(url1,encoding = "utf-8")
lastpage_link <- web %>% html_nodes("div.layui-box a") %>% html_attr("href")
lastpage_link <- paste0("http://fund.zsci.com.cn/",lastpage_link[length(lastpage_link)])
lastpage_web <- read_html(lastpage_link,encoding = "utf-8")
lastpage_number <- lastpage_web %>% html_nodes("div.layui-box span.current") %>% html_text() %>% as.integer()
- 利用循环,获取所有页面信息
i=1
site <- 'http://fund.zsci.com.cn/Index/index/title/lncRNA/start_year/2016/end_year/2019/xmid/0/search/1/p/'
#创建一个空的数据框用来存储抓取的数据
results <- data.frame(Title="题目",Author="负责人",Department="申请单位",
Type="研究类型",Project="项目批准号",Date="批准年度",Money="金额")
for(i in 1:lastpage_number){
url <- paste0(site,i,".html")
web <- read_html(url,encoding = "utf-8")
#---获得基金标题---
Title <- web %>% html_nodes('ul a li h3') %>% html_text() # 标题内容解析
#---获得众多信息---
Information <- web %>% html_nodes('ul a li span') %>% html_text() #获取了负责人和单位信息
#---获取负责人信息---
Author <- Information[grep("负责人", Information)]
#---获得申请单位---
Department <- Information[grep("申请单位", Information)]
#---获取研究类型---
jijintype <- Information[grep("研究类型", Information)]
#---获得项目号---
Project <- Information[grep("项目批准号", Information)]
#---获取批准时间---
Date <- Information[grep("批准年度", Information)]
#---获取基金金额---
Money <- Information[grep("金额", Information)]
result <- data.frame(Title=Title,Author=Author,Department=Department,
Type=jijintype,Project=Project,Date=Date,Money=Money)
#合并所有页面数据成数据框
results <- rbind(results,result)
}
write.csv(results,file = "2016-2019_lncRNA国自然.csv")
爬取结果如下,共计1200多条记录。
往期回顾
R爬虫在工作中的一点妙用
R爬虫必备基础——HTML和CSS初识
R爬虫必备基础——静态网页+动态网页
R爬虫必备——rvest包的使用
R爬虫必备基础——CSS+SelectorGadget
R爬虫必备基础—Chrome开发者工具(F12)
R爬虫必备基础—HTTP协议
R爬虫必备—httr+POST请求类爬虫(网易云课堂)
R爬虫必备基础—rvest为什么不用于动态网页?
R爬虫必备——httr+GET请求类爬虫(解螺旋课程)
R爬虫实战—抓取PubMed文章的基本信息