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


安装 Python 和Selenium 的过程就不讲了,下面直接上代码。目标是下载知网某个期刊某一期的全部文件(PDF格式)。这里以 《教育研究》这个期刊为例,下载其中2021年第5期的所有文献。

1 下载 Chrome 的 Webdriver

想要用 Selenium 操控浏览器,首先需要下载浏览器对应的WebDriver。Chrome 对应的 WebDriver 可以在
ChromeWebdriver下载地址
里面下载,注意浏览器的版本和 WebDriver 的版本必须匹配,不然可能会报错。谷歌浏览器的版本在 设置 → \rightarrow 关于Chrome 里面查看。

查看浏览器版本

查看浏览器版本

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 找到期刊名在网页上对应元素

这个期刊网站是这样的
期刊网站

代码如下

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); # 知网反应比较慢,需要等几秒

下载完成,关闭浏览器。

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值