知网文章批量下载

通过读取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()

实现方式比较简单粗暴,同时程序运行时也存在一些小问题,如网页加载速度比程序运行慢时会出现文献下载重复