利用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 的版本必须匹配,不然可能会报错。谷歌浏览器的版本在 设置
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')
有几个点需要注意:
- path 指的是下载的 WebDriver 所在的目录,比如我这里是在 ‘D:\Webdriver\chromedriver_win32’ 里面,但是目录后面需要带上 WebDriver 的不加后缀.exe文件名,比如我的 webdriver 的文件名本来是 ‘chromedriver.exe’,在代码里只能写 ‘D:\Webdriver\chromedriver_win32\chromedriver’,不加 .exe !
- 这个 implicitly_wait() 里面是程序在操作时需要等待的秒数。具体说就是,程序的执行的速度是非常快的,但是网页的加载是需要时间的。比如说用程序去寻找网页上一个名为 ‘button’ 的元素,程序可能在网页还没有加载出来的时候就已经完成了寻找的过程,但是这个时候,因为你的网页还没加载好,所以肯定是找不到的,会报错。这个 implicitly_wait(15) 的意思就是,程序如果在网页上找不到指定的元素,就每隔半秒寻找一次,如果15秒还没找到,就报错。
- ‘https://navi.cnki.net/knavi/journals/WGJY/detail?uniplatform=NZKPT’ 是这个期刊的网站,我是在教育网环境中测试的,所以可以直接下载。一般的网络不注册购买是下载不了的。
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
2.3 找到期刊名在网页上对应元素
这个期刊网站是这样的
代码如下
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 下载期刊
我这里下载的步骤是这样的,
- 打开所有的期刊的下载页;
- 关掉最开始的期刊所在网页;
- 依次点击每个下载页面的 “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); # 知网反应比较慢,需要等几秒