摸鱼日记002
前情提要
什么?你要问我为什么001还没出来?那是因为001还没摸完,但是002已经做完了。趁着摸鱼的功夫一鼓作气写出来。
今天在工作中碰到了一个问题:
导师语重心长地说:挨个找一下,所有A类会议和B类期刊以上的论文,现在没有出现在参考文献的(仅在bib文件但没有引用不行),列出来。
我数了一下,200多篇(快捷方式),手动搜索比对得到啥时候啊!!!心态当时就崩了!
问了下师兄(怂,不敢问导师),师兄说他给你快捷方式什么文献管理工具都不好使……那看起来只能一个个找了。万幸这里面大部分都是CCF-A CCF-B,剔除非上述要求花不了几分钟,但是在overleaf上看是否引用就得获得bib然后用Ctrl+F作对比,我先手动试了几个,一个从截取论文名称到google scholar搜索获得bib再到overleaf工程中寻找大概一分钟,重复机械效率太低了。
作为计算机相关专业的学生,怎么能不会偷懒(写脚本)呢?所以立马决定用爬虫的方式进行解决。
解决方案
首先根据文件命名格式,把论文名称切出来再说
def get_file_name_list(file_path):
ls = []
for i in os.listdir(file_path):
index = i.find(']')
# ls.append()
ls.append(i[index+1:-15])
return ls
获取bib则利用chrome驱动(教程在此https://blog.csdn.net/qq_43571807/article/details/105664246),模拟搜索即可。思路就是
1、先得到搜索网址url
2、然后对搜索结果进行点击进入论文详情页
3、最后点击引用符号即可获取。
利用selenium框架,对网页html结构做一个简单分析即可。话不多说直接上代码:
def paperUrl(name):
q = name
params = {
'q':q
}
params = parse.urlencode(params)
url = "https://scholar.google.com/scholar?" + params
return url
def getBib(url):
options = Options()
# options.add_argument('-headless')
driver = webdriver.Chrome(options=options)
driver.get(url)
# time.sleep(4)
driver.find_element_by_class_name('gs_or_cit').click()
time.sleep(3)
s = driver.find_element_by_class_name('gs_citi')
if s.text == 'BibTeX':
hr = s.get_attribute('href')
driver.get(hr)
bib = driver.find_element_by_xpath("//*").text
driver.quit()
return bib
主函数调用即可
if __name__ == '__main__':
temp_ls = get_file_name_list(file_path)
print(temp_ls)
for q in temp_ls:
url = paperUrl(q)
bib = getBib(url)
print(bib)
结果如图所示
反思
这样做还有个问题是google有反爬虫机制。可以注意到我为了避免触发这个机制还是使用了time.sleep()函数,但是仍然被封了不少ip. 今天运气好,找到了一个不被封的梯子,但是如何解决反爬虫,那就是下次摸鱼的事情了。
引用
感谢大神的框架,省了我很多学习时间
https://blog.csdn.net/weixin_45177899/article/details/117364354