年度巨作!The big data of The Plant Cell : PC年度大数据抓取及分析(二)

接上回说到爬虫已经基本成型,经过一些测试及debug,修改了一些地方。

首先还是编码的问题,一些人名地名出现什么德语法语拉丁语,易发生编码错误。

1
2
3
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

Python2容易出现这种问题,所以把上面这段敲上去,解决问题一劳永逸,虽然有人不太推崇这种不安全的方式,但我真的懒得再把文本一个个转换了。。

之后在抓取摘要也出现一些问题,当指向一些 IN BRIEF.abstract网站时会跳转到.short,再直接抓取也会抓到多段文字。
因为只想抓取研究文章,所以加上判断,段落数大于1则不进行抓取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
soup = BeautifulSoup(html,'lxml')
contents = []
for i in soup.find_all('p'):
#print (i.string)
try:
if u"p-" in str(i['id']):
content = str(i)[(str(i).find(">") + 1):(str(i).find("</p>", str(i).find(">") + 1))]
#print (content)
content = re.sub(r'<.*?>', '', str(content))
content = re.sub(r'\n', ' ', str(content))
content = re.sub(r' +', ' ', str(content))
if len(content) > 250:
contents.append(content)
except:
pass
if len(contents) > 1:
print ("content error")
contents = []
address_list = []
author_list = []

基本上就没有问题啦,把程序跑上,然后吃个饭去。

跑完了^_^统计一下总共有169篇文章被抓取,并把作者,机构,摘要分别归入不同的表中。

弄了一个很蠢的像.fa的文本结构,>146为页数,并把每篇文章的机构前加上了顺序。

数据到手了,先从简单的开始,看一看作者的数据。
这里的作者我只抓取了最后一位通讯作者。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def main(input_file, output_file):
all = []
count = 1
with open (input_file) as f:
for i in f:
if i[0] == ">":
pass
else:
all.append(i[:-1])
print (len(all))
tag_all = {}
for each in all:
if each not in tag_all.keys():
tag_all[each] = 1
else:
tag_all[each] += 1
print (tag_all)
fou = open('tmp.txt', 'w')
for (k,v) in tag_all.items():
tab = str(k) + '\t' + str(v) + '\n'
fou.write(str(tab))
fou.close()
data = pd.DataFrame(pd.read_table('tmp.txt', names = ['a','b']))
data = data.sort(['b'],axis = 0, ascending = False)
data.to_csv(output_file, sep='\t')
os.popen('rm tmp.txt')

首先数据清洗,把”>”页码标记给去除,只留下作者。把作者及作者出现次数储存进字典里,最后使用pandas简单排序。

结果:

结果似乎差别都不大,最多的通讯作者一年也只是发了2篇文章,发表2篇文章的作者共有5位。
可以看到有国内清华的戚益军教授,其中还包含了一篇Review。

作者的数据似乎没有太多好挖掘的,就到这里了,所有作者数据及最后的结果统计我也放在github上了,感兴趣的可以自己下载来玩。

接下来看看机构的数据。
将机构顺序进行分类:第n位的机构分别归入第n个文件。
先来看第一单位的数据,先不进行处理,直接进行统计:

发现有地名,机构,还有学院都混了进去,于是要进行一些数据清理。
观察原始数据,发现基本上倒数两个名称为城市或国家,之前的为机构,所以可以依此把机构和地区分开。

先来统计地区:

基本上还行,唯一的问题就是美国的文章是只注明州的,也许需要手工将这些数据合并,还有就是出现了多个China,包括China、P.R. China、PR China,我也懒得再改程序了,数据这么少我就人工在整理一下好了。

最后用ggplot2可视化:

论文大户依然是几个老牌发达国家及中国,米国依然是稳居第一,总体来说也没有什么令人惊讶的地方。

再把目光放到机构的数据上,之前因为数据中含有大量的学院啊、系啊、实验室等元素,我们只需要大学或研究院的数据,所以将其进行过滤:

1
2
3
4
if u'Department' in each or u'College' in each or u'School' in each or u'Institute' in each or u'Laboratory' in each:
pass
else:
all.append(each)

得到:

这里有一些值得注意的地方,把INRA和CNRA在原文件中进行查找:

发现全部指向同一个学校 Université Paris-Saclay
这个学校是什么一种存在呢?搜了一搜(来自百度):

巴黎-萨克雷大学(Université Paris-Saclay)是一所于2014年12月29日在法国巴黎南郊成立的的一所巨型大学 。
巴黎-萨克雷合并了2所大学、10所大学校(Grande Ecole)与7个研究所,其中包括巴黎综合理工学院(Ecole Polytechnique)、巴黎高等商业研究学院(HEC Paris)、巴黎中央理工-高等电力学院(Centrale-Supélec)和巴黎第十一大学(Université Paris-Sud)、凡尔赛大学(Université de Versailles-Saint-Quentin-en-Yvelines)等。校园面积达1350英亩,有约60000名学生与10500名科研人员

七个研究所:
CNRS(国立中央科学研究所)
CEA(原子能研究所)
IHES(高等研究所)
INRA(国立农业研究所)
INRIA(国立计算机与自动化研究所)
ONERA(国立航空研究办公室)
INSERM(国立健康与药物研究所)

大意就是法国的学校实在是小而精,整合成这么一个共同体有利于提高世界排名。

于是把这些都合并到 Université Paris-Saclay
还有其他一些不好识别的名称,手动进行整合。

最后:

进行一下简单的解读,第一位是中科院系统,随后是比利时VIB研究所,美国文章虽然多,但机构较为分散。
不对此排名发表任何看法。

代码、数据、图片都上传到github上。

Yumin Huang wechat
快来订阅我的公众号吧-,-
坚持原创分享,来支持一下作者吧~