selenium 知网爬虫之根据【关键词】获取文献信息

这篇具有很好参考价值的文章主要介绍了selenium 知网爬虫之根据【关键词】获取文献信息。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

哈喽大家好,我是咸鱼

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

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

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

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

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

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

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

言归正传,咸鱼昨天收到一位粉丝私信说能不能根据【关键词】来搜索文献
selenium 知网爬虫之根据【关键词】获取文献信息
今天这篇文章着重讲如何分析网页结构然后使用 selenium 根据知网的关键词来搜索文献。至于对搜索到的文献的爬取,本文不过多介绍,因为以前的文章已经写过了

需求分析

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

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

首先我们登录网站,点击【高级搜索】(也可以直接点击搜索框中的【主题】下拉选择)
selenium 知网爬虫之根据【关键词】获取文献信息
然后我们点击【主题】——>选择【关键词】
selenium 知网爬虫之根据【关键词】获取文献信息
selenium 知网爬虫之根据【关键词】获取文献信息
输入要搜索的关键词(例如:数字普惠金融)然后点击【检索】
selenium 知网爬虫之根据【关键词】获取文献信息

网页分析&元素定位

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

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

然后我们需要点击 【主题】,才会出现下拉框。在分析网页的时候我发现当出现下拉框时,标签 <div class="sort-list" style="display: none;">" 中的 style 属性由 "display: none;" 变成 "display: block;"
selenium 知网爬虫之根据【关键词】获取文献信息
下拉框出现之后,我们需要定位到 【关键词】 这个标签

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

li[data-val="KY"]

selenium 知网爬虫之根据【关键词】获取文献信息
接着找到【搜索框】的 Xpath 路径。这里是一个 input 元素,用于接收来自用户的数据

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

selenium 知网爬虫之根据【关键词】获取文献信息

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

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

selenium 知网爬虫之根据【关键词】获取文献信息
点击搜索之后我们把【文献条数】爬取下来

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

selenium 知网爬虫之根据【关键词】获取文献信息

代码实现

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

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

导入相关库

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.action_chains import ActionChains

创建浏览器对象

这里我用的是 Edge 浏览器

def webserver():
    # get直接返回,不再等待界面加载完成
    desired_capabilities = DesiredCapabilities.EDGE
    desired_capabilities["pageLoadStrategy"] = "none"

    # 设置微软驱动器的环境
    options = webdriver.EdgeOptions()
    
    # 设置浏览器不加载图片,提高加载速度
    options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})

    # 创建一个微软驱动器
    driver = webdriver.Edge(options=options)
    return driver

爬取网页

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

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

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

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

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

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

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

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

就会使得程序点击不了【关键词】
selenium 知网爬虫之根据【关键词】获取文献信息
而且我还发现如果加载不完全的话,需要鼠标移动到下拉框那里,让下拉框完全加载。所以这里我使用了 selenium 中的 ActionChains 来模拟鼠标的操作

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

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

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

# 【通讯作者】定位
/html/body/div[2]/div/div[2]/div/div[2]/div[1]/div[1]/div[2]/ul/li[8]

li[data-val="RP"]

selenium 知网爬虫之根据【关键词】获取文献信息

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

    # 鼠标移动到下拉框
    ActionChains(driver).move_to_element(driver.find_element(By.CSS_SELECTOR, 'li[data-val="RP"]')).perform()

    # 找到[关键词]选项并点击
    WebDriverWait(driver, 100).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, 'li[data-val="KY"]'))).click()

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

    # 传入关键字
    WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.XPATH, '''//*[@id="gradetxt"]/dd[1]/div[2]/input'''))
    ).send_keys(keyword)

    # 点击搜索
    WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.XPATH, "/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/input"))
    ).click()

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

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

完整代码如下:

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.common.action_chains import ActionChains


def webserver():
    # get直接返回,不再等待界面加载完成
    desired_capabilities = DesiredCapabilities.EDGE
    desired_capabilities["pageLoadStrategy"] = "none"

    # 设置微软驱动器的环境
    options = webdriver.EdgeOptions()
    # 设置浏览器不加载图片,提高速度
    options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})

    # 创建一个微软驱动器
    driver = webdriver.Edge(options=options)

    return driver


def open_page(driver, keyword):
    # 打开页面,等待两秒
    driver.get("https://kns.cnki.net/kns8/AdvSearch")
    time.sleep(2)

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

    # 鼠标移动到下拉框中的[通讯作者]
    ActionChains(driver).move_to_element(driver.find_element(By.CSS_SELECTOR, 'li[data-val="RP"]')).perform()

    # 找到[关键词]选项并点击
    WebDriverWait(driver, 100).until(
        EC.visibility_of_element_located((By.CSS_SELECTOR, 'li[data-val="KY"]'))).click()

    # 传入关键字
    WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.XPATH, '''//*[@id="gradetxt"]/dd[1]/div[2]/input'''))
    ).send_keys(keyword)

    # 点击搜索
    WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.XPATH, "/html/body/div[2]/div/div[2]/div/div[1]/div[1]/div[2]/div[2]/input"))
    ).click()

    # 点击切换中文文献
    WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.XPATH, "/html/body/div[3]/div[1]/div/div/div/a[1]"))
    ).click()

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

    # 去除千分位里的逗号
    res_unm = int(res_unm.replace(",", ''))
    page_unm = int(res_unm / 20) + 1
    print(f"共找到 {res_unm} 条结果, {page_unm} 页。")


if __name__ == '__main__':
    keyword = "数字普惠金融"
    driver = webserver()
    open_page(driver, keyword)

结果如下:
selenium 知网爬虫之根据【关键词】获取文献信息文章来源地址https://www.toymoban.com/news/detail-711296.html

到了这里,关于selenium 知网爬虫之根据【关键词】获取文献信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 长尾词和关键词的区别,长尾关键词最简单最常用的2个​获取方法

        要知道长尾词与的区别就要先了解什么是,什么是长尾词。      什么是呢?     是定义您的内容的想法和主题。     什么是长尾词呢?     长尾词是与相关的,可以带来搜索流量的组合型。     获取长尾的最简单的2个方

    2024年02月11日
    浏览(49)
  • 使用Python编写搜索引擎关键词排名监测爬虫

    目录 1. 了解排名监测的重要性 2. 选择合适的搜索引擎 3. 构建排名监测爬虫

    2024年02月09日
    浏览(58)
  • 掌握Python爬虫实现网站关键词扩展提升曝光率

    目录 一、优化的重要性 二、优化的基本方法 1、选择与网站内容相关的 2、控制的密度和分布 3、的层次布局 三、Python爬虫实现网站扩展 1、确定目标网站 2、分析目标网站的HTML结构 3、编写Python爬虫代码 4、分析爬取到的数据

    2024年02月07日
    浏览(54)
  • 深度学习实战20(进阶版)-文件智能搜索系统,可以根据文件内容进行关键词搜索,快速找到文件

    大家好,我是微学AI,今天给大家带来深度学习实战项目-文件智能搜索系统,文件智能搜索系统是一种能够帮助用户通过文件的内容快速搜索和定位文件的软件系统。 随着互联网和数字化技术的普及,数据和信息呈现爆炸式增长的趋势,文件管理和搜索变得越来越困难。传统

    2024年02月13日
    浏览(45)
  • Python获取高德POI(关键词搜索法)

    该篇文章是搜索法获取高德poi,但鉴于无法突破900条记录的上限,因此重写了 矩形搜索法 的文章,具体可参考以下文章: 高德poi获取之矩形搜索法(冲出900条限制) (建议没有python基础的朋友先阅读该篇再看矩形搜索法!) 首先我们需要明白一些常识 poi是兴趣点,它

    2024年02月06日
    浏览(58)
  • 【爬虫实战】用python爬取微博任意关键词搜索结果、exe文件

    项目功能简介: 1.交互式配置; 2.两种任意来源(直接输入、本地文件); 3.自动翻页(无限爬取); 4.指定最大翻页页码; 5.数据保存到csv文件; 6.程序支持打包成exe文件; 7.项目操作说明文档; 一.最终效果 视频演示: 用python爬取微博搜索结果、exe文件

    2024年02月02日
    浏览(70)
  • 写几个获取搜索引擎提示关键词列表的方法,方便以后使用

    什么是# 当你在搜索引擎中输入字符的时候,会有一个下拉框显示一些和列表,用来提示你想搜啥。 直接上代码 方便以后直接复制使用,使用例子 非常的好用哇,为什么要有个sign标识呢,因为多次调用会存在一个问题,就是不知道这次的列表是对应我输入的什

    2024年02月07日
    浏览(55)
  • 关键词组合工具-自动关键词挖掘组成关键词软件免费

    组合工具,今天给大家分享一款免费的挖掘工具。自动挖掘流量,过滤无效。自动组成,组成标题。以及自动采集文章。详细参考图片 不少的网站能在相关的搜索引擎呈现的话,组合工具普通都会被这个搜索引擎所收录,不然也

    2023年04月08日
    浏览(68)
  • GPT关键词挖掘,自动关键词文章生成

    随着互联网的发展,内容营销已成为企业营销策略中不可或缺的一环。有效的文章生成可以帮助企业吸引更多的潜在客户,提高品牌曝光度和转化率,从而实现营销目标。 文章生成是指根据特定的和主题,使用软件工具自动生成相关的文章内容。与传统的

    2024年02月01日
    浏览(60)
  • 实现同时查找多个关键词——KeywordCrafter - 关键词匠心

    具体功能:同时查找多个,高亮加粗显示,并显示出现次数。 🧐碎碎念:最近在写文案的时候,总是要避免出现一个敏感词汇,利用 (command+F) or (Ctr+F) 查找,只能一个一个单词去查,很麻烦。🤷‍♂️ 所以我写了一个简单的网页,在文本框输入一整篇文章,在

    2024年02月13日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包