知網文章批量下載
通過讀取txt文檔中的參考文獻來實現批量下載文獻
參考文獻格式:
[1]陳曉強. 基於BYOD的高中Python項目式學習模式研究[J]. 試題與研究,2020(18):112-113. [2]安娜,徐洪峰. 基於導向車道實時利用率的單點全感應式信號控制方法[J]. 工業技術創新,2020,07(03):61-65. [3]鄭偉,劉玉林. 基於復雜網絡的高校教師職業倦怠熱點研究[J]. 黑龍江高教研究,2020,38(06):50-55.
詳細代碼:
1 #cnkiBatchDown.py 2 import time 3 import re 4 from selenium import webdriver 5 from selenium.webdriver.support.select import Select 6 7 opt = webdriver.ChromeOptions() #創建瀏覽器 8 #opt.set_headless() #無窗口模式 9 10 out_path = r'E:\test\文獻' # 是你想指定的路徑 11 prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': out_path} 12 opt.add_experimental_option('prefs', prefs) 13 14 driver = webdriver.Chrome(options=opt) #創建瀏覽器對象 15 time.sleep(0.5) 16 driver.maximize_window() #最大化窗口 17 driver.get('http://new.gb.oversea.cnki.net/kns/brief/result.aspx?dbprefix=SCDB') #打開網頁 18 time.sleep(0.5) #加載等待 19 20 with open('text.txt', 'r', encoding='UTF-8') as f: 21 lines = f.readlines() # 讀取文本中所有內容,並保存在一個列表中,列表中每一個元素對應一行數據 22 print('共'+str(len(lines))+'篇') 23 starttime = time.time() 24 for i in range(26,len(lines)): 25 print('\n\n正在下載第'+str(i+1)+'篇') 26 print(lines[i].strip('\n')) # 每一行數據都包含了換行符 27 string = lines[i] 28 firstpoint = string.index('.') 29 str1 = string[firstpoint+1:] 30 #print(str1) 31 autherEnd = str1.index(',') 32 titleStart = str1.index('.') 33 titleEnd = str1.index('[') 34 type1 = str1[titleEnd+1] 35 if type1 == 'D': 36 autherEnd = titleStart 37 38 #print(autherEnd) 39 #print(titleStart,titleEnd) 40 print('第一作者:', str1[:autherEnd]) 41 print('標題:', str1[titleStart+2:titleEnd]) 42 print('類型:', str1[titleEnd+1]) 43 44 title = str1[titleStart+2:titleEnd] 45 auther = str1[:autherEnd] 46 47 handles = driver.window_handles # 獲取當前窗口句柄集合(列表類型) 48 driver.switch_to.window(handles[0]) 49 s = Select(driver.find_element_by_id("txt_1_sel")) 50 # 定位選項 51 s.select_by_value("TI") # 選擇value="TI"的項:通過value屬性 52 driver.find_element_by_xpath('//*[@id="txt_1_value1"]').clear() 53 driver.find_element_by_xpath('//*[@id="au_1_value1"]').clear() 54 driver.find_element_by_xpath('//*[@id="txt_1_value1"]').send_keys(title) #利用xpath查找元素進行輸入文本 55 driver.find_element_by_xpath('//*[@id="au_1_value1"]').send_keys(auther) 56 driver.find_element_by_xpath('//*[@id="btnSearch"]').click() 57 time.sleep(0.5) 58 driver.switch_to.frame("iframeResult") 59 time.sleep(1.5) 60 if type1 == 'J' : 61 driver.find_element_by_xpath("/html/body/form/table/tbody/tr[2]/td/table/tbody/tr[2]/td[8]/a").click()#期刊直接點擊下載 62 print("期刊下載") 63 time.sleep(5) 64 elif type1 == 'C': 65 print("跳過會議論文") 66 continue 67 else: 68 driver.find_element_by_xpath("/html/body/form[1]/table/tbody/tr[2]/td/table/tbody/tr[2]/td[2]/a").click()#碩博論文點擊跳轉 69 print("碩博論文跳轉") 70 handles = driver.window_handles # 獲取當前窗口句柄集合(列表類型) 71 driver.switch_to.window(handles[1]) 72 driver.find_element_by_xpath("/html/body/div[6]/div[2]/div[2]/div[1]/div[2]/a[4]").click()#碩博論文點擊下載 73 print("碩博論文下載") 74 time.sleep(5) 75 driver.close() #關閉當前標簽頁 76 print('共計用時: ', round(time.time() - starttime, 0), '秒', end="\r") 77 #driver.quit()
實現方式比較簡單粗暴,同時程序運行時也存在一些小問題,如網頁加載速度比程序運行慢時會出現文獻下載重復
程序運行前要先登錄可用的VPN或者連接校園網