利用Selenium自动下载知网期刊文件

  • 1 下载 Chrome 的 Webdriver
  • 2 代码
  • 2.1 导入相关的包
  • 2.2 设置 WebDriver
  • 2.3 找到期刊名在网页上对应元素
  • 2.4 下载期刊



安装 Python 和Selenium 的过程就不讲了,下面直接上代码。目标是下载知网某个期刊某一期的全部文件(PDF格式)。这里以

《教育研究》这个期刊为例,下载其中2021年第5期的所有文献。

1 下载 Chrome 的 Webdriver

想要用 Selenium 操控浏览器,首先需要下载浏览器对应的WebDriver。Chrome 对应的 WebDriver 可以在
ChromeWebdriver下载地址 里面下载,注意浏览器的版本和 WebDriver 的版本必须匹配,不然可能会报错。谷歌浏览器的版本在 设置python文献综述 python期刊文献_Chrome

python文献综述 python期刊文献_chrome_02

python文献综述 python期刊文献_python文献综述_03

2 代码

2.1 导入相关的包

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

如果用的 Selenium 的版本是 Selenium4,那么第 2 行代码是需要的。如果是更低版本,那么可以不要。

2.2 设置 WebDriver

path='D:\Webdriver\chromedriver_win32\chromedriver'

my_browser=webdriver.Chrome(executable_path=path)
my_browser.implicitly_wait(15)
my_browser.get('https://navi.cnki.net/knavi/journals/WGJY/detail?uniplatform=NZKPT')

有几个点需要注意:

  1. path 指的是下载的 WebDriver 所在的目录,比如我这里是在 ‘D:\Webdriver\chromedriver_win32’ 里面,但是目录后面需要带上 WebDriver 的不加后缀.exe文件名,比如我的 webdriver 的文件名本来是 ‘chromedriver.exe’,在代码里只能写 ‘D:\Webdriver\chromedriver_win32\chromedriver’,不加 .exe !
  2. 这个 implicitly_wait() 里面是程序在操作时需要等待的秒数。具体说就是,程序的执行的速度是非常快的,但是网页的加载是需要时间的。比如说用程序去寻找网页上一个名为 ‘button’ 的元素,程序可能在网页还没有加载出来的时候就已经完成了寻找的过程,但是这个时候,因为你的网页还没加载好,所以肯定是找不到的,会报错。这个 implicitly_wait(15) 的意思就是,程序如果在网页上找不到指定的元素,就每隔半秒寻找一次,如果15秒还没找到,就报错。
  3. ‘https://navi.cnki.net/knavi/journals/WGJY/detail?uniplatform=NZKPT’ 是这个期刊的网站,我是在教育网环境中测试的,所以可以直接下载。一般的网络不注册购买是下载不了的。

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

2.3 找到期刊名在网页上对应元素

这个期刊网站是这样的

python文献综述 python期刊文献_python文献综述_04

代码如下

year='2021';
vol='05';

# 点击相应的年份和期数
my_browser.find_element(By.ID,'yq'+year+vol).click();

# 等2s,等网页加载好
time.sleep(2)

# 找到期刊所在的框
paperList = my_browser.find_element(By.ID,'CataLogContent');

# 在这个框里找到期刊名对应的元素
papers=paperList.find_elements(By.CSS_SELECTOR,'.name > a');

# 打印一下期刊的数量
len(papers)

2.4 下载期刊

我这里下载的步骤是这样的,

  1. 打开所有的期刊的下载页;
  2. 关掉最开始的期刊所在网页;
  3. 依次点击每个下载页面的 “PDF下载” 按钮。

代码如下:

# 点击打开所有的期刊下载页
for paper in papers:
    paper.click();
    
# 关掉原有窗口
my_browser.close();

# 记录所有窗口的句柄
currentHandles=my_browser.window_handles;

# 依次点击每个窗口的PDF下载
for my_handle in currentHandles:
    my_browser.switch_to_window(my_handle);
    pdfDown = my_browser.find_element_by_id('pdfDown')
    time.sleep(3); # 知网反应比较慢,需要等几秒
    pdfDown.click();
    time.sleep(5); # 知网反应比较慢,需要等几秒