在Sustainability上发文最多的原来是这些高校
本文作者:王玉婷,中南财经政法大学金融学院
文字编辑:李婷婷
技术总编:余术玲
爬虫俱乐部云端课程
导读
Sustainability(以下简称Sus)是由出版商MDPI于2009年创立的一家开源期刊(Open Access Journal)。从2009年到2020年,Sus不过12岁,从最初的季刊,发展至如今的半月刊,并在刊文数量和收稿范围方面轻松超越诸位“老前辈”。为了让大家更深入地了解Sus,我们通过网络爬虫抓取了该刊自创刊以来的所有文献目录及其作者单位。下面,就让我们一起来看看如何实现吧~
20000余篇!
首先,通过分析源网页,我们发现需要抓取的文章链接和题目位于<a class="title-link" href="
标签所在的行。
其次,使用copy
爬虫命令、字符串函数和正则表达式抓取并保留我们需要的内容。
clear all
copy "https://www.mdpi.com/2071-1050/1/1" temp.txt,replace
infix strL v 1-100000 using temp.txt,clear
keep if strpos(v,`""title-link" href=""')
**使用正则表达式提取文章题目和链接**
gen title = ustrregexs(1) if ustrregexm(v,`"(?<=">)(.*?)(?=</a>)"')
replace title = ustrregexra(title,"<.*?>","")
gen title_link = ustrregexs(1) if ustrregexm(v,`"(?<=href=")(.*?)(?=">)"')
replace title_link = "https://www.mdpi.com" + title_link
drop v
save v1_part1,replace
最后,根据URL的规律,借助一个三 层 大 循 环就能把所有的文章链接和题目抓取下来以备二次爬虫(抓取作者单位)使用啦~
clear all
cap mkdir "D:/Sus"
cd "D:/Sus"
local a = 1
forvalues v = 1/12{
forvalues i =1/24{
forvalues p = 0(15)1500{
clear
cap copy "https://www.mdpi.com/2071-1050/`v'/`i'/default/`p'/15" temp.txt,replace
if _rc == 601{
continue,break
}
infix strL v 1-100000 using temp.txt
if v[1] == "" & v[2] == "" & v[3] == ""{
continue,break
}
keep if strpos(v,`""title-link" href=""')
gen title = ustrregexs(1) if ustrregexm(v,`"(?<=">)(.*?)(?=</a>)"')
replace title = ustrregexra(title,"<.*?>","")
gen title_link = ustrregexs(1) if ustrregexm(v,`"(?<=href=")(.*?)(?=">)"')
replace title_link = "https://www.mdpi.com" + title_link
drop v
**第一层循环:保存每一期所有页面的文章URL**
save v`v'_is`i'_p`a',replace
local a = `a' + 1
}
**第二层循环:合并每一期的所有文章URL**
clear
openall v`v'_is`i'*,directory(D:/Sus/)
**为防止空数据集无法保存导致报错,此处应使用capture命令。**
**在两层以上的循环中一定要特别注意!**
cap save v`v'_is`i'_url,replace
if _rc == 111{
continue,break
}
}
**第三层循环:合并每一卷所有期的文章URL**
clear
openall v`v'_is*_url,directory(D:/Sus/)
save v`v'_urlall,replace
}
运行结果如下所示:
经过整理,我们发现:
Sus在创刊当年仅刊发79篇文章,次年改为月刊,刊文量翻倍至199篇。2016年刊发量大增,为1346篇。其后四年,Sus的发文量暴增,连年翻倍,2019年达到7200余篇。
截止2020年9月,该刊在近12年之间一共刊发了25500余篇论文,从环境发展到商业经济均有涉及。
发文量top10
我们已经拿到总共12卷所有文章的URL,下面我们就利用这些链接来爬取文章的作者、国籍及其所属机构。
cap mkdir "D:/Sus/top"
cd "D:/Sus/top"
clear all
forvalues v = 1/12{
use "D:/Sus/v`v'_urlall",clear
levelsof title_link,local(title_link)
local a = 1
foreach url in `title_link'{
clear
cap copy `"`url'"' temp.txt,replace
while _rc != 0{
sleep 5000
cap copy `"`url'"' temp.txt,replace
}
infix strL v 1-100000 using temp.txt,clear
keep if ustrregexm(v,`"affiliation-item|affiliation-name| </h1>"')
replace v = ustrregexra(v,`"<.*?>"',"")
**信息过于繁杂,此处采用删除各种备注标识(eg.*、‡)所在的行及其后一行的处理方法**
drop if v[_n-1] == "*" | v[_n-1] == "†" | v[_n-1] == "‡" | v[_n-1] == "#" | v[_n-1] == "§" | v[_n-1] == "||"
drop if v == "*" | v == "†" | v == "‡" | v == "#" | v == "§" | v == "||"
gen title = v[1],before(v)
drop in 1
gen inname = v[_n+1]
replace inname = v if inname == ""
keep if mod(_n,2)
rename v inid
gen title_link = `"`url'"'
**第一层循环:爬取并保存每一篇文章的作者信息**
save v`v'_artins_`a',replace
local a = `a' + 1
}
**第二层循环:将每一卷所有的作者信息进行合并**
clear
openall v`v'_artins_*,directory(D:/Sus/top/)
save v`v'_artinsall,replace
}
**循环外:合并全部12卷的作者信息**
clear all
openall v*_artinsall,directory(D:/Sus/top/)
save artinsall,replace
通过分类汇总等操作,我们发现:由中国大陆各类学术机构署名的文章有12923篇,高居榜首,第二名的美国有3600余篇,韩国和西班牙不甘示弱,紧随其后,末位的澳大利亚和荷兰也有800余篇。
国内高校哪家强?
为了对国内高校(大陆)发文量进行排序,我们首先利用利用正则表达式或字符串函数保留机构名称(inname)中含China
的观测值,并进一步剔除非高校发表的作者信息:
use "D:/Sus/top/artinsall.dta",clear
replace inid = "1" if inid[_n] == inname[_n]
drop if ustrregexm(inid,"\D") //剔除机构id为非数字的观测值
replace inname = subinstr(inname,"amp;","",.)
keep if strpos(inname,"China")
keep if ustrregexm(inname,"School|Institute|University|Academy|College")
由于作者信息较繁杂,包含作者姓名、所属机构(包括学院、研究院、学校等)、作者地址、邮编、国籍等,然而这些条目并没有严格的、一致的顺序,因此要精准地提取出作者所属的机构并不是一件容易的事。笔者的思路是:先将作者信息按英文逗号拆分,再将含有School
或Institute
或University
或Academy
或College
的变量合并。
split inname,p(",")
drop inname
qui des inname*,varlist //使用describe命令以获得以inname开头的变量名
gen inname = ""
foreach v in `r(varlist)'{ //r(varlist)即为上述des命令的返回值之一
replace inname = inname+","+`v' if ustrregexm(`v',"School|Institute|University|Academy|College") ///
& !ustrregexm(`v',"Rd.|Road|Town")
drop `v'
}
为保留最大级别的机构名称,比如一篇文章署名为:School of Finance, Zhongnan University of Economics and Law
,我们要将Zhongnan University of Economics and Law
保留下来,而最大级别的机构名称一般位于末尾,我们采用逆向查找匹配的方法。
**逆向查找匹配**
gen len = strlen(inname)
qui sum len
forval i = `r(max)'(-1)1{
**逆向查找第一个(最后一个)英文逗号**
replace inname = substr(inname,`i',.) if ustrregexm(substr(inname,`i',.),"(?<!\d),\s+(?!\d)")
}
replace inname = subinstr(inname,",","",1)
drop len
**清洗、分组汇总**
replace inname = trim(inname) //剔除字符串两边的空格
replace inname = subinstr(inname,"&","and",.)
replace inname = subinstr(inname,`"´"',`"'"',.) //替换英文撇号为英文单引号
bysort inname:egen sum = count(inname)
bysort inname:keep if _n == 1
gsort -sum
save institute_en,replace
经过整理,我们就能拿到国内高校在Sus上发文的排行榜啦~限于篇幅,本文仅展示发文量大于等于10的大陆高校。
不知各位看官有没有疑惑,明明抓取的机构信息都是英文名称,这里咋直接给出了中文名称?top10我还能手工翻译,这近一千条的高校信息不会真的有人要手工翻译吧?不会吧?不会吧?
为解决这个疑惑,下一篇推文我们将为各位“懒人”介绍在Stata中实现英译中,请继续关注唷~
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!往期推文推荐用词云图看2020社科基金课题~建议收藏!Python精选推文干货合集
xpose和sxpose,谁是卧底?让你的数据一目了然--label命令介绍Python推文合集基础篇(下)|算法简介【小白指南】Python中有哪些数据类型?(附推文合集)轻松获取通行数据——cntraveltime命令介绍让Stata完美牵手中国地图之cnmapsearch自然语言分析——利用NLTK进行文本预处理寻找B站的最爱--8月B站全站榜爬虫cnaddress命令——实现经纬度转换为中文地址定位神器——cngcodePython入门—Spyder的简单使用Jupyter Notebook 的这些tips你了解吗?给变量名换马甲之rename命令追踪命令set trace on——解你燃眉之急爬虫大杀器 | “手把手”教你配置Selenium关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。