首页 > 其他分享 >selenium 知网爬虫之根据【关键词】获取文献信息

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

时间:2023-10-28 09:46:24浏览次数:38  
标签:webdriver selenium driver 爬虫 element div 知网 下拉框

哈喽大家好,我是咸鱼

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

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

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

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

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

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

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

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

需求分析

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

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

首先我们登录网站,点击【高级搜索】(也可以直接点击搜索框中的【主题】下拉选择)
image
然后我们点击【主题】——>选择【关键词】
image
image
输入要搜索的关键词(例如:数字普惠金融)然后点击【检索】
image

网页分析&元素定位

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

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

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

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

li[data-val="KY"]

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

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

image

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

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

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

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

image

代码实现

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)

就会使得程序点击不了【关键词】
image
而且我还发现如果加载不完全的话,需要鼠标移动到下拉框那里,让下拉框完全加载。所以这里我使用了 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"]

image

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

    # 鼠标移动到下拉框
    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)

结果如下:
image

标签:webdriver,selenium,driver,爬虫,element,div,知网,下拉框
From: https://www.cnblogs.com/edisonfish/p/17793652.html

相关文章

  • 手把手教你写Python爬虫
    Python爬虫是一个很常见的工具,它能够自动抓取网站数据,并将数据存储到本地或者其他地方。本文将教你如何使用Python编写爬虫,并详细介绍代码实现过程。准备工作在开始编写代码之前,我们需要安装几个必要的Python库,包括requests和beautifulsoup4。这两个库都可以使用pip命令......
  • API商品数据接口调用爬虫实战
    随着互联网的发展,越来越多的商家开始将自己的商品数据通过API接口对外开放,以供其他开发者使用。这些API接口可以提供丰富的商品数据,包括商品名称、价格、库存、图片等信息。对于爬虫开发者来说,通过调用这些API接口,可以更加便捷地获取商品数据,避免了爬取网页数据的繁琐过程。本文将......
  • 通过requests库使用HTTP编写的爬虫程序
    使用Python的requests库可以方便地编写HTTP爬虫程序。以下是一个使用requests库的示例:importrequests#发送HTTPGET请求response=requests.get("http://example.com")#检查响应状态码ifresponse.status_code==200:#获取响应内容html=response.text......
  • scrapy中爬虫数据如何异步存储mysql数据库jd
    1.SQLCREATETABLE`JDAll`(`shop_id`VARCHAR(16)NOTNULL,//商品ID`url`VARCHAR(255)DEFAULTNULL,//商品url`title`VARCHAR(1024)DEFAULTNULL,//商品标题`brand`VARCHAR(255)DEFAULTNULL,//品牌`brand_url`VARCHAR(1024)DEF......
  • Python自动化测试selenium指定截图文件名方法
    这篇文章主要介绍了Python自动化测试selenium指定截图文件名方法,Selenium支持Web浏览器的自动化,它提供一套测试函数,用于支持Web自动化测试,下文基于python实现指定截图文件名方法,需要的小伙伴可以参考一下前言:Selenium支持Web浏览器的自动化,它提供一套测试函数,用于支持W......
  • SOCKS5代理在全球电商、游戏及网络爬虫领域的技术创新
    随着全球化进程的加速,跨界电商和游戏行业的出海战略愈发重要。在这个大背景下,技术如SOCKS5代理和网络爬虫成为连接不同领域、优化用户体验和提升市场竞争力的重要桥梁。本文将深入探讨SOCKS5代理技术在跨界电商、游戏和网络爬虫领域的应用及其对行业发展的推动作用。一、SOCKS5代理......
  • SOCKS5代理在全球电商、游戏及网络爬虫领域的技术创新
    随着全球化进程的加速,跨界电商和游戏行业的出海战略愈发重要。在这个大背景下,技术如SOCKS5代理和网络爬虫成为连接不同领域、优化用户体验和提升市场竞争力的重要桥梁。本文将深入探讨SOCKS5代理技术在跨界电商、游戏和网络爬虫领域的应用及其对行业发展的推动作用。一、SOCKS5代理......
  • python selenium 利用pyautogui+ActionChains 完美解决我的滑块验证登录问题
    在解决滑块验证的时候不知道什么原因明明是滑块已经对上了,代码执行就是会校验不通过,手动时就可以,中间也做利用ActionChains模块减速滑动轨迹的操作,但仍然不行,后面在执行代码中添加了pyautogui模块使鼠标悬停在屏幕中的某个点而不改变ActionChains鼠标的定位后终于每次都能通过了fro......
  • 爬虫加解密分析
    1、找到加密的接口地址,通过加密的接口地址全局搜索2、通过打断点的方式,找到加密串;3、找到用的是哪种加密方式,找到对应方式的加密语言加解密即可。     参考链接:https://blog.csdn.net/zhinian1204/article/details/124112512https://blog.csdn.net/cuilun000/a......
  • 软件测试|Selenium StaleElementReferenceException 异常分析与解决
    简介Selenium是一个流行的自动化测试工具,用于模拟用户与网页交互。然而,当我们在使用Selenium时,可能会遇到一个常见的异常,即StaleElementReferenceException。这个异常通常在我们尝试与网页上的元素交互时抛出,可能会导致我们的自动化测试脚本运行失败。本文将深入探讨StaleElem......