6.15 补充数据集,即找到每篇论文相对应的year、venue、quote数据,以相同的格式(每行对应一篇论文)保存到txt文件中。
前两天尝试了从OAG官网下载数据,然后从本地数据集中查找对应的论文,但是发现OAG提供的论文数据量太大,针对每一篇论文去查找速度有些慢。
所以转变思路,使用论文检索工具,搜索每一篇论文的题目,然后网址上就会展示论文的各种信息。这里使用的是google scholar国内镜像版,论文信息如下图:
首先我们先新建一个test.txt,里面包含30篇论文的题目作为测试,测试没问题后再应用于正式数据。处理test.txt文本,形成论文题目的list,每一篇论文的题目是一个元素,str类型。
# 测试-处理文本,形成论文题目的list,每一篇论文的题目是一个元素,str类型
filepath = 'D:/大学资料/大三下/项目实训/数据处理/test.txt'
f = open(filepath,'r')
title = []
for line in f:
lines = line.strip('\n')
title.append(lines)
print(title[:3])
f.close()
然后就是数据爬取部分,思路是我们先爬取一篇指定论文的对应数据(year、venue、quote),定义一个获取信息的函数。然后观察url链接形式,根据题目自动生成链接然后爬取所有论文对应的数据。PS:我们顺便爬取论文的被引用数,往后数据可视化展示时可能会用到。
测试-爬取一篇指定论文的year、venue和quote:
import requests
from bs4 import BeautifulSoup
# 测试-爬取一篇指定论文的year、venue和quote
url = 'https://proxy.niostack.com/scholar?q=the+anatomy+of+a+large-scale+hypertextual+web+search+engine+'
res = requests.get(url)
res.encoding='utf-8'
soup = BeautifulSoup(res.text,'html.parser')
# 获取venue信息
text = soup.select('.card-title')[0].select('a')
len1 = len(text)
index = len1-2
venue = text[index].text
# 取被引用次数信息
quote = text[-1].text
# 获取year信息
text1 = soup.select('.card-title')[0].text.split('·')
index2 = len(text1)-2
year = text1[index2].split()[-1]
print(quote)
print(year)
print(venue)
结果输出如下:
对应网站数据:
对比后发现爬取结果正确。
接下来,我们定义获取论文信息的函数:
# 定义爬取一篇论文数据的函数
def get_Info(url):
res = requests.get(url)
res.encoding='utf-8'
soup = BeautifulSoup(res.text,'html.parser')
# 获取venue信息
text = soup.select('.card-title')[0].select('a')
length = len(text)
if length > 2:
index = length-2
venue = text[index].text
else:
venue = ''
# 取被引用次数信息
quote = text[-1].text
# 获取year信息
text1 = soup.select('.card-title')[0].text.split('·')
if len(text1)> 1:
index2 = len(text1)-2
year = text1[index2].split()[-1]
else:
year = ''
# 如果论文对应题目找不到year等信息(没有找到匹配的论文)则输出一行空格
if not(year.isdigit()):
venue = ' '
year = ' '
quote = ' '
return venue,year,quote
注意,我们可能遇到检索不到对应论文的情况,比如数据集中的论文信息有一些只有一个单词,这样仅凭题目是找不到对应论文的,所以在这里我们就先把venue、year、quote数据设为空值。随后再做单独处理。
接下来我们观察论文对应网页的url:
authoritative sources in a hyperlinked environment:
https://proxy.niostack.com/scholar?q=authoritative+sources+in+a+hyperlinked+environment+
the anatomy of a large-scale hypertextual web search engine:
https://proxy.niostack.com/scholar?q=the+anatomy+of+a+large-scale+hypertextual+web+search+engine+
lessons learned from building a terabyte digital video library:
https://proxy.niostack.com/scholar?q=lessons+learned+from+building+a+terabyte+digital+video+library+
我们找到了规律,‘https://proxy.niostack.com/scholar?q=’后面的查询参数,他会把论文题目的每个单词拆开,后面跟一个+。这样我们就可以根据论文题目自己构造链接了。
我们先来测试一个数据:
# 测试-根据论文题目生成相应的url
base_url = 'https://proxy.niostack.com/scholar?q='
title0 = title[5].split()
add = ''
for i in range(len(title0)):
add += title0[i]+'+'
final_url = base_url+add
venue,year,quote = get_Info(final_url)
print(year)
print(venue)
print(quote)
运行结果如下:
对应网站数据如下:
我们发现测试结果正确。接下来我们根据论文题目生成相应的url并写入一个txt。
# 测试-根据论文题目生成相应的url并写入一个txt
filepath2 = 'D:/大学资料/大三下/项目实训/数据处理/links.txt'
f2 = open(filepath2,'w')
for i in range(len(title)):
title0 = title[i].split()
add = ''
for j in range(len(title0)):
add += title0[j]+'+'
final_url = base_url+add
lines = final_url+'\n'
f2.write(lines)
f2.close()
经过以上测试后,我们来处理所有的数据。
# 正式 根据论文题目生成相应的url并写入一个txt
filepath0 = 'D:/大学资料/大三下/项目实训/code+data/ACM数据集/nodes.txt'
f0 = open(filepath0,'r')
title = []
for line in f0:
lines = line.strip('\n')
title.append(lines)
print(title[:3])
f0.close()
filepath3 = 'D:/大学资料/大三下/项目实训/code+data/ACM数据集/links.txt'
f3 = open(filepath3,'w')
for i in range(len(title)):
title0 = title[i].split()
add = ''
for j in range(len(title0)):
add += title0[j]+'+'
final_url = base_url+add
lines = final_url+'\n'
f3.write(lines)
f3.close()
print('已生成论文题目对应的url链接')
# 正式-获取所有论文的数据信息并存入txt中
# 读入所有的论文链接
file_links = 'D:/大学资料/大三下/项目实训/code+data/ACM数据集/links.txt'
flinks = open(file_links,'r')
links = []
for line in flinks:
lines = line.strip('\n')
links.append(lines)
print(links[:3])
flinks.close()
# 新建venues.txt
file_venues = 'D:/大学资料/大三下/项目实训/code+data/ACM数据集/venues.txt'
fvenues = open(file_venues,'w')
# 新建years.txt
file_years = 'D:/大学资料/大三下/项目实训/code+data/ACM数据集/years.txt'
fyears = open(file_years,'w')
# 新建quotes.txt
file_quotes = 'D:/大学资料/大三下/项目实训/code+data/ACM数据集/quotes.txt'
fquotes = open(file_quotes,'w')
# 想对应文件写入内容
for link in links:
venue,year,quote = get_Info(link)
venues = venue+'\n'
years = year+'\n'
quotes = quote+'\n'
fvenues.write(venues)
fyears.write(years)
fquotes.write(quotes)
fvenues.close()
fyears.close()
fquotes.close()
print('所有数据已写入对应文档')
运行的时候报了错:
检查发现原来是因为有些论文题目是空值,这样对应的url链接是‘https://proxy.niostack.com/scholar?q=’,这时打开的网页是
检查网页源码发现没有class为‘card-title’的
# 获取venue信息
if not( soup.select('.card-title')):
venue,year,quote = '\n','\n','\n'
return venue,year,quote
最终生成的txt文件形式是:
years.txt:
venues.txt:
quotes.txt: