即找到每篇论文相对应的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’的
标签,所以程序会报错。这时我们需要单独处理标题为空的论文,所以在进行数据爬取之前先有一个判断,判断题目是否为空,如果为空,则没有对应的year,venue和quote。如果不为空,则正常爬取数据。修改get_Info函数,增加if判断。 # 获取venue信息 if not( soup.select('.card-title')): venue,year,quote = '\n','\n','\n' return venue,year,quote最终生成的txt文件形式是: years.txt: venues.txt: quotes.txt:
上述内容详见:
https://blog.csdn.net/WX1204/article/details/106758742