知网文章批量下载

通过读取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或者连接校园网

 

版权声明:本文为zyt5014原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zyt5014/p/13137619.html