哈喽大家好,我是咸鱼

之前咸鱼写过几篇关于知网爬虫的文章,后台反响都很不错。虽然但是,咸鱼还是忍不住想诉苦一下

有些小伙伴文章甚至代码看都没看完,就问我 ”为什么只能爬这么多条文献信息?“(看过代码的会发现我代码里面定义了 papers_need 变量来设置爬取篇数),”为什么爬其他文献不行?我想爬 XXX 文献“(因为代码里面写的是通过【知网高级搜索中的文献来源】来搜索文章),或者是有些小伙伴直接把代码报错贴给我,问我咋回事

我觉得在网上看到别人的代码,不要一昧地拿来主义,复制粘贴就行了,你要结合你自己的本地环境对代码做适当地修改。比如定位 Xpath 元素路径,不通电脑或者说不同浏览器同一元素的 Xpath 路径有可能不是一样的,这个路径在我本地运行没问题,到了你那里就报错

当看别人的代码时,最好先搞清楚:

  1. 别人是怎么想的
  2. 别人为什么要这么写
  3. 这么写的逻辑是什么?

以我这几篇知网爬虫文章举例:

  1. 为什么要用 selenium 来爬取?
  2. 如何分析网页?如何定位元素?(Xpath、CSS 选择器等等)
  3. 如何通过 selenium 来模拟人为操作浏览器(鼠标移动、点击、滑动窗口等等)

言归正传,咸鱼昨天收到一位粉丝私信说能不能根据【关键词】来搜索文献



今天这篇文章着重讲如何分析网页结构然后使用 selenium 根据知网的关键词来搜索文献。至于对搜索到的文献的爬取,本文不过多介绍,因为以前的文章已经写过了

需求分析

我们先来看下如果要通过关键词搜索文献,该怎么操作?

知网:中国知网 (cnki.net)

首先我们登录网站,点击【高级搜索】(也可以直接点击搜索框中的【主题】下拉选择)



然后我们点击【主题】——>选择【关键词】





输入要搜索的关键词(例如:数字普惠金融)然后点击【检索】

网页分析&元素定位

结合前面的需求分析,我们就可以对网页进行分析并定位出对应的元素

首先是【高级搜索】,高级搜索有一个链接:高级检索-中国知网 (cnki.net),这样就能省掉一个步骤了

然后我们需要点击 【主题】,才会出现下拉框。在分析网页的时候我发现当出现下拉框时,标签 <div class="sort-list" style="display: none;">" 中的 style 属性由 "display: none;" 变成 "display: block;"



下拉框出现之后,我们需要定位到 【关键词】 这个标签

  1. # 关键词 Xpath 路径或 CSS 选择器
  2. //*[@id="gradetxt"]/dd[1]/div[2]/div[1]/div[2]/ul/li[3]
  3. li[data-val="KY"]



接着找到【搜索框】的 Xpath 路径。这里是一个 input 元素,用于接收来自用户的数据

  1. # 输入框
  2. //*[@id="gradetxt"]/dd[1]/div[2]/input

往输入框传入数据之后,我们需要点击下面的【检索】按钮

  1. # 检索
  2. /html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/input



点击搜索之后我们把【文献条数】爬取下来

  1. # 文献条数
  2. /html/body/div[3]/div[2]/div[2]/div[2]/form/div/div[1]/div[1]/span[1]/em

代码实现

selenium 是一个自动化测试工具,可以用来进行 web 自动化测试。其本质是通过驱动浏览器,完全模拟浏览器的操作(比如跳转、输入、点击、下拉等)来实现网页渲染之后的结果,可支持多种浏览器

爬虫中用到 selenium 主要是为了解决 requests 无法直接执行 JavaScript 代码等问题

导入相关库

  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from selenium.webdriver.common.by import By
  6. from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
  7. from selenium.webdriver.common.action_chains import ActionChains

创建浏览器对象

这里我用的是 Edge 浏览器

  1. def webserver():
  2. # get直接返回,不再等待界面加载完成
  3. desired_capabilities = DesiredCapabilities.EDGE
  4. desired_capabilities["pageLoadStrategy"] = "none"
  5. # 设置微软驱动器的环境
  6. options = webdriver.EdgeOptions()
  7. # 设置浏览器不加载图片,提高加载速度
  8. options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
  9. # 创建一个微软驱动器
  10. driver = webdriver.Edge(options=options)
  11. return driver

爬取网页

其实逻辑并不难,就是先定位到各个元素然后用 selenium 来模拟我们人为点击浏览器的操作就行了

首先打开页面,等待个一两秒让网页完全加载

  1. driver.get("https://kns.cnki.net/kns8/AdvSearch")
  2. time.sleep(2)

然后然下拉框显示出来,前面我们提到:标签 <div class="sort-list" style="display: none;">" 中的 style 属性由 "display: none;" 变成 "display: block;" 时,就会出现下拉框

这里我们通过执行 js 脚本来修改里面的 style 属性

  1. # 修改属性,使下拉框显示
  2. opt = driver.find_element(By.CSS_SELECTOR, 'div.sort-list') # 定位下拉框
  3. # 执行 js 脚本进行属性的修改; arguments[0]代表第一个属性
  4. driver.execute_script("arguments[0].setAttribute('style', 'display: block;')", opt)

下拉框显示出来之后我们需要点击【关键词】,这样才会切换到关键词搜索

这里需要注意的是,当我在测试的时候发现下拉框加载是有问题的,这时候代码会报错说Element <li data-val="KY">...</li> is not clickable at point (189, 249)

就会使得程序点击不了【关键词】



而且我还发现如果加载不完全的话,需要鼠标移动到下拉框那里,让下拉框完全加载。所以这里我使用了 selenium 中的 ActionChains 来模拟鼠标的操作

用 selenium 做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击、双击、点击鼠标右键、拖拽等等

selenium 给我们提供了一个类来处理这类事件——ActionChains

还有一点需要注意的是:如果鼠标只是移到【关键词】,下拉框其实还是不能正确加载出来,最好是移动到下拉框的最底部或者关键词后面的元素,这里我移动到【通讯作者】

  1. # 【通讯作者】定位
  2. /html/body/div[2]/div/div[2]/div/div[2]/div[1]/div[1]/div[2]/ul/li[8]
  3. li[data-val="RP"]

下拉框加载完成之后,定位到【关键词】再点击

  1. # 鼠标移动到下拉框
  2. ActionChains(driver).move_to_element(driver.find_element(By.CSS_SELECTOR, 'li[data-val="RP"]')).perform()
  3. # 找到[关键词]选项并点击
  4. WebDriverWait(driver, 100).until(
  5. EC.visibility_of_element_located((By.CSS_SELECTOR, 'li[data-val="KY"]'))).click()

定位出搜索框,传入我们要搜索的关键词

  1. # 传入关键字
  2. WebDriverWait(driver, 100).until(
  3. EC.presence_of_element_located((By.XPATH, '''//*[@id="gradetxt"]/dd[1]/div[2]/input'''))
  4. ).send_keys(keyword)
  5. # 点击搜索
  6. WebDriverWait(driver, 100).until(
  7. EC.presence_of_element_located((By.XPATH, "/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/input"))
  8. ).click()

搜索结果出来之后定位【文献条数】,获取对应的条数(text 标签)

  1. # 获取总文献数和页数
  2. res_unm = WebDriverWait(driver, 100).until(EC.presence_of_element_located(
  3. (By.XPATH, "/html/body/div[3]/div[2]/div[2]/div[2]/form/div/div[1]/div[1]/span[1]/em"))
  4. ).text

完整代码如下:

  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. from selenium.webdriver.common.by import By
  6. from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
  7. from selenium.webdriver.common.action_chains import ActionChains
  8. def webserver():
  9. # get直接返回,不再等待界面加载完成
  10. desired_capabilities = DesiredCapabilities.EDGE
  11. desired_capabilities["pageLoadStrategy"] = "none"
  12. # 设置微软驱动器的环境
  13. options = webdriver.EdgeOptions()
  14. # 设置浏览器不加载图片,提高速度
  15. options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
  16. # 创建一个微软驱动器
  17. driver = webdriver.Edge(options=options)
  18. return driver
  19. def open_page(driver, keyword):
  20. # 打开页面,等待两秒
  21. driver.get("https://kns.cnki.net/kns8/AdvSearch")
  22. time.sleep(2)
  23. # 修改属性,使下拉框显示
  24. opt = driver.find_element(By.CSS_SELECTOR, 'div.sort-list') # 定位元素
  25. driver.execute_script("arguments[0].setAttribute('style', 'display: block;')", opt) # 执行 js 脚本进行属性的修改;arguments[0]代表第一个属性
  26. # 鼠标移动到下拉框中的[通讯作者]
  27. ActionChains(driver).move_to_element(driver.find_element(By.CSS_SELECTOR, 'li[data-val="RP"]')).perform()
  28. # 找到[关键词]选项并点击
  29. WebDriverWait(driver, 100).until(
  30. EC.visibility_of_element_located((By.CSS_SELECTOR, 'li[data-val="KY"]'))).click()
  31. # 传入关键字
  32. WebDriverWait(driver, 100).until(
  33. EC.presence_of_element_located((By.XPATH, '''//*[@id="gradetxt"]/dd[1]/div[2]/input'''))
  34. ).send_keys(keyword)
  35. # 点击搜索
  36. WebDriverWait(driver, 100).until(
  37. EC.presence_of_element_located((By.XPATH, "/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/input"))
  38. ).click()
  39. # 点击切换中文文献
  40. WebDriverWait(driver, 100).until(
  41. EC.presence_of_element_located((By.XPATH, "/html/body/div[3]/div[1]/div/div/div/a[1]"))
  42. ).click()
  43. # 获取总文献数和页数
  44. res_unm = WebDriverWait(driver, 100).until(EC.presence_of_element_located(
  45. (By.XPATH, "/html/body/div[3]/div[2]/div[2]/div[2]/form/div/div[1]/div[1]/span[1]/em"))
  46. ).text
  47. # 去除千分位里的逗号
  48. res_unm = int(res_unm.replace(",", ''))
  49. page_unm = int(res_unm / 20) + 1
  50. print(f"共找到 {res_unm} 条结果, {page_unm} 页。")
  51. if __name__ == '__main__':
  52. keyword = "数字普惠金融"
  53. driver = webserver()
  54. open_page(driver, keyword)

结果如下:

selenium 知网爬虫之根据【关键词】获取文献信息的更多相关文章

  1. Python开源爬虫项目代码:抓取淘宝、京东、QQ、知网数据--转

    数据来源:数据挖掘入门与实战  公众号: datadw scrapy_jingdong[9]- 京东爬虫.基于scrapy的京东网站爬虫,保存格式为csv.[9]: https://github.co ...

  2. 使用selenium模拟知网登录

    之前都是用phantomjs和selenium模拟浏览器动作的,后来phantomjs不再更新,就转用chrome了 本次模拟登录的网站是中国知网http://login.cnki.net/login ...

  3. 使用Python + Selenium打造浏览器爬虫

    Selenium 是一款强大的基于浏览器的开源自动化测试工具,最初由 Jason Huggins 于 2004 年在 ThoughtWorks 发起,它提供了一套简单易用的 API,模拟浏览器的各种操 ...

  4. Python爬虫学习==>第十二章:使用 Selenium 模拟浏览器抓取淘宝商品美食信息

    学习目的: selenium目前版本已经到了3代目,你想加薪,就跟面试官扯这个,你赢了,工资就到位了,加上一个脚本的应用,结局你懂的 正式步骤 需求背景:抓取淘宝美食 Step1:流程分析 搜索关键字 ...

  5. 【收藏】收集的各种Python爬虫、暗网爬虫、豆瓣爬虫、抖音爬虫 Github1万+星

    收集的各种Python爬虫.暗网爬虫.豆瓣爬虫  Github 1万+星 磁力搜索网站2020/01/07更新 https://www.cnblogs.com/cilisousuo/p/1209954 ...

  6. Python爬取中国知网文献、参考文献、引证文献

    前两天老师派了个活,让下载知网上根据高级搜索得到的来源文献的参考文献及引证文献数据,网上找了一些相关博客,感觉都不太合适,因此特此记录,希望对需要的人有帮助. 切入正题,先说这次需求,高级搜索,根据中 ...

  7. selenium常用操作,查找元素,操作Cookie,获取截图,获取窗口信息,切换,执行js代码

    目录: 1. 常用操作 2. 查找元素 3. 操作Cookie 4. 获取截图 5. 获取窗口信息 6. 切换 7. 执行JS代码 简介 selenium.webdriver.remote.webdr ...

  8. 练手爬虫用urllib模块获取

    练手爬虫用urllib模块获取 有个人看一段python2的代码有很多错误 import re import urllib def getHtml(url): page = urllib.urlope ...

  9. 中国知网cnki(永久会员账号)

    中国知网cnki(永久会员账号)大男孩免费分享   网站简介: (中国知网http://www.cnki.net/)中国知网是国家知识基础设施(National Knowledge Infrastru ...

  10. 论文 查重 知网 万方 paperpass

    相信各个即将毕业的学生或在岗需要评职称.发论文的职场人士,论文检测都是必不可少的一道程序.面对市场上五花八门的检测软件,到底该如何选择?选择查重后到底该如何修改?现在就做一个知识的普及.其中对于中国的 ...

随机推荐

  1. ENVI实现QUAC、简化黑暗像元、FLAASH方法的遥感影像大气校正

    本文介绍基于ENVI软件,实现对Landsat 7遥感影像加以预处理与多种不同大气校正方法的操作. 目录 1 数据导入与辐射定标 2 波段合成 3 编辑头文件 4 转换文件格式 5 QUAC快速大气校 ...

  2. JVM GC配置指南

    本文旨在简明扼要说明各回收器调优参数,如有疏漏欢迎指正. 1.JDK版本 以下所有优化全部基于JDK8版本,强烈建议低版本升级到JDK8,并尽可能使用update_191以后版本. 2.如何选择垃圾回 ...

  3. 2023-07-13:如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串。 花括号展开的表达式可以看作一个由 花括号、逗号 和 小写英文字母 组成的字符串 定义下面几条语

    2023-07-13:如果你熟悉 Shell 编程,那么一定了解过花括号展开,它可以用来生成任意字符串. 花括号展开的表达式可以看作一个由 花括号.逗号 和 小写英文字母 组成的字符串 定义下面几条语 ...

  4. 【阅读笔记】提升example-based SISR七个技巧

    论文信息 [Seven ways to improve example-based single image super resolution]-Radu Timofte, 2016, CVPR 论文 ...

  5. Centos7 安装部署 Kubernetes(k8s) 高可用集群

    目录 一.系统环境 二.前言 三.Kubernetes(k8s)高可用简介 四.配置机器基本环境 五.部署haproxy负载均衡器 六.部署etcd集群 七.部署Kubernetes(k8s) mas ...

  6. test.sh

    #!/bin/bash echo "=== show OS version ===" cat /etc/os-release echo "=== show IP addr ...

  7. Linux下定时清空某个文件

    问题 在一台单点机器部署完成且运行一段时间后,发现页面接口报错,登上机器发现磁盘满了.通过du -lh --max-depth=1 和 du -sh * 找出是哪个文件. 发现是 项目中 stdout ...

  8. python教程 入门学习笔记 第3天 编程基础常识 代码注释 变量与常量

    编程基础常识 一.注释 1.对代码的说明与解释,它不会被编译执行,也不会显示在编译结果中 2.注释分为:单行注释和多行注释 3.用#号开始,例如:#这是我的第一个python程序 4.注释可以写在单独 ...

  9. idea的maven home默认路径无法修改成功的问题

    主要原因是项目里有许多初始默认文件 删除项目初始化后的生成的.mvn mvnw mvnw.cmd help.md .gitignore等文件后再修改mavenhome,然后reload maven就修 ...

  10. GitHub Actions CI/CD 工作流实战

    1. 什么是 GitHub Actions 与 workflow ? GitHub Actions 是 GitHub 提供的一种持续集成(CI)和持续部署(CD)的工具,用于自动化软件开发过程中的各种 ...