知网文章批量下载
通过读取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()
实现方式比较简单粗暴,同时程序运行时也存在一些小问题,如网页加载速度比程序运行慢时会出现文献下载重复