搞科研的小夥伴總是會被期刊嚴苛的引用文獻格式搞的很頭疼。雖然常用的文獻軟體可以一鍵匯出BibTex,但由於很多論文在投稿之前都會先發上Arxiv佔坑,軟體就很可能會把文獻引出為來自Arxiv。我用的是Zotero,就有這個毛病。

  因此,如果是IEEE的期刊,最好是直接去IEEE官網搜尋並匯出引用,否則可以使用谷歌學術。為了減少重複性的動作,我使用selenium來幫我完成這些操作。Selenium是Python的一個爬蟲包,具體可以看:Python Selenium庫的使用

  在此之前,需要安裝的有:

  1、谷歌瀏覽器。也可以用別的瀏覽器,具體看上面的Selenium教程。

  2、Selenium控制谷歌瀏覽器的驅動。網址

  3、配置驅動的環境變數,就是把驅動解壓的位置放到PATH裡。感覺可有可無,因為程式碼中還是會用到驅動的位置。

  下面是Python程式碼,具體操作就是先從IEEE官網找,如果找不到再去谷歌學術找。需要具體配置的地方已在程式碼中註釋:

#%% 從IEEE與谷歌學術爬取論文引用
from selenium import webdriver
from urllib import parse
from time import sleep class GetBibs():
def __init__(self, driver_path, option_path, ie_search_url, gg_search_url) -> None:
self.ie_search_url = ie_search_url
self.gg_search_url = gg_search_url
# 啟用帶外掛的瀏覽器
option = webdriver.ChromeOptions()
option.add_argument("--user-data-dir="+option_path)
self.browser = webdriver.Chrome(executable_path = driver_path, options = option) # 開啟chrome瀏覽器
self.browser.set_window_size(800,800) #不要隨意修改,太窄會導致按鈕的隱藏,模擬點選失效 def get_bib_from_IEEE(self, paper_title):
strto_pn=parse.quote(paper_title)
url = self.ie_search_url + strto_pn
self.browser.get(url)
compare_title = ''.join(list(filter(str.isalnum, paper_title))).lower()
#等待詞條載入
for i in range(100):
try:
elements=self.browser.find_elements_by_css_selector("[class='List-results-items']")
elements[0].get_attribute('id')
break
except:
sleep(0.1)
#掃描所有詞條,是否存在所需文獻
paper_url = r'https://ieeexplore.ieee.org/document/'
for i in elements:
s_title = i.text.split('\n')[0]
s_title = ''.join(list(filter(str.isalnum, s_title))).lower()
if s_title == compare_title:
paper_url += i.get_attribute('id')
break
if paper_url == r'https://ieeexplore.ieee.org/document/': #沒找到
return ''
# 進入文獻頁面
self.browser.get(paper_url)
# 等待載入bib按鈕
for i in range(100):
try:
element=self.browser.find_element_by_css_selector("[class='layout-btn-white cite-this-btn']")
element.click()
break
except:
sleep(0.1)
# 點選bibtex
for i in range(100):
try:
element=self.browser.find_element_by_css_selector("[class='modal-dialog']")
element=element.find_elements_by_css_selector("[class='document-tab-link']")[1]
element.click()
break
except:
sleep(0.1)
for i in range(100):
try:
self.browser.find_element_by_css_selector("[class='text ris-text']")
break
except:
sleep(0.1)
sleep(2)
bib = self.browser.find_element_by_css_selector("[class='text ris-text']").text
return bib def get_bib_from_google_scholar(self, paper_title):
strto_pn=parse.quote(paper_title)
url = self.gg_search_url + strto_pn
self.browser.get(url)
#等待詞條載入
for i in range(100):
try:
element=self.browser.find_element_by_css_selector("[class='gs_r gs_or gs_scl']")
element=element.find_element_by_css_selector("[class='gs_fl']")
element=element.find_element_by_css_selector("[class='gs_or_cit gs_nph']")
element.click()
break
except:
sleep(0.1)
for i in range(100):
try:
element=self.browser.find_element_by_id("gs_citi")
element=element.find_element_by_css_selector("[class='gs_citi']")
element.click()
break
except:
sleep(0.1)
for i in range(100):
try:
bib = self.browser.find_element_by_tag_name('pre').text
break
except:
sleep(0.1)
return bib def get_bib(self, paper_title):
bib = self.get_bib_from_IEEE(paper_title)
if bib != '':
return "IEEE", bib
return "Google", self.get_bib_from_google_scholar(paper_title) driver_path = r'C:/chromedriver/chromedriver' # 瀏覽器驅動位置
option_path = r"C:/Users/Administrator/AppData/Local/Google/Chrome/User Data/" # 使瀏覽器能用你自定義的設定,否則Selenium建立的瀏覽器物件是預設設定,一些外掛就不能用了
ie_search_url = r'https://ieeexplore.ieee.org/search/searchresult.jsp?newsearch=true&queryText=' # 在執行程式碼之前,先開啟IEEE官網的搜尋頁面,把類似的網址複製到這裡,等號=後面就是一會兒要搜尋的內容
gg_search_url = r'https://scholar.google.com/scholar?hl=zh-CN&as_sdt=0%2C5&inst=1597255436240989024&q=' # 谷歌學術也是一樣
get_bibs = GetBibs(driver_path, option_path, ie_search_url, gg_search_url)
#%% **********************以上定義爬蟲物件,以下開始爬取*******************************
paper_titles = { # 要爬取的論文,key用於標記,value是論文題目。下面是一些樣例
"ESPCN":'Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network',
"Sparse_Coding":'Image Super-Resolution Via Sparse Representation',
"ESRGAN":'ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks',
"EnhanceNet":'EnhanceNet: Single Image Super-Resolution Through Automated Texture Synthesis',
'Meta-SR': 'Meta-SR: A Magnification-Arbitrary Network for Super-Resolution',
'SAN': 'Second-Order Attention Network for Single Image Super-Resolution',
} for k in paper_titles.keys():
source, bib = get_bibs.get_bib(paper_titles[k])
print(source+":",k)
print(bib)
print()

  IEEE與谷歌學術可能需要VPN,在爬之前要先做好準備。另外IEEE還需要登入機構賬號,在此之前也要先登入好。