哈喽大家好,我是咸鱼

之前写过一篇获取知网文献信息的文章(关于《爬取知网文献信息》中代码的一些优化),看了下后台数据还挺不错

所以咸鱼决定再写一篇知网文献信息爬取的文章

需要注意的是文章只是针对某一特定期刊的爬取,希望小伙伴们把关注点放在如何分析网页以及如何定位元素上面

这样就能写出适合自己的爬虫代码了,而不是照搬我的

网址链接:https://navi.cnki.net/knavi/journals/RKYZ/detail?uniplatform=NZKPT

需求分析

我们来分析下网页结构

由上图可得知:

  • 左边是一个个年份(2023、2022、2021),年份下面还有期数(No.03、No.02、No.01)
  • 右边加粗的字体看作是大标题,每一个大标题下面都有要获取的文献标题(其实是一个个链接)

那我们需要做的就是把这些文献的链接一个个先获取下来,然后再打开每一条链接去获取对应文献的信息(摘要、关键词......)

但是今天咸鱼先只写爬到文献链接那一步,后面的打开每条链接获取文献信息这部分小伙伴们可以先自己尝试一下,

我们以爬取 2022 年相关文献为例子,得出 selenium 模拟人浏览网页的操作,然后分析网页并定位元素

首先点击年份 2022,然后依次点击期数(No.06、No.05.....)



我们每点击一次期数,然后就爬取对应期数下面的文献链接,并用大标题分类

需要注意的是:每一期最后可能会有几篇没有大标题的链接,那个不是我们要获取的文献,所以我们需要做一个判断:

  • 如果大标题存在,就获取下面的内容
  • 如果没有大标题,就跳过不获取

最后我们将获取到的链接和标题保存在 csv 文件里面,如下所示

元素定位

首先我们来分析一下年份的元素路径,F12 打开开发者工具

然后点击元素,把鼠标移到对应元素那里

#年份 xpath 路径
//dl[@id='2022_Year_Issue']

按照上面的方法我们依次来定位

得到定位路径如下:

# 期数 xpath 路径
//dl[@id='2022_Year_Issue']/dd/a[starts-with(@id, 'yq')] # 大标题 xpath 路径
./dt[@class="tit"] # 文献链接 xpath 路径
./dd/span/a

代码实现

源码如下:

# -*- coding:utf-8 -*-
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 class CnkiSpider(object):
def __init__(self):
self.url = "https://navi.cnki.net/knavi/journals/RKYZ/detail?uniplatform=NZKPT" # get直接返回,不再等待界面加载完成
self.desired_capabilities = DesiredCapabilities.CHROME
self.desired_capabilities["pageLoadStrategy"] = "none" # 设置浏览器驱动器的环境
self.options = webdriver.ChromeOptions() # 设置浏览器不加载图片,提高速度
self.options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2}) # 设置不显示窗口
self.options.add_argument('--headless') # 创建一个浏览器驱动器
self.driver = webdriver.Chrome(options=self.options) def get_url(self):
url_dict = {} self.driver.get(self.url)
time.sleep(3) # 年份
WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.XPATH, "//dl[@id='2022_Year_Issue']"))).click() # 期数
for i in WebDriverWait(self.driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, "//dl[@id='2022_Year_Issue']/dd/a[starts-with(@id, 'yq')]"))):
# date = i.get_attribute('id') # yq202206
i.click()
time.sleep(3)
for j in WebDriverWait(self.driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="CataLogContent"]/div/div'))):
href_list = []
# 大标题:例如深入学习贯彻党的二十大精神
theme = WebDriverWait(j, 10).until(EC.presence_of_element_located((By.XPATH, './dt[@class="tit"]'))).text
if theme:
for element in WebDriverWait(j, 10).until(EC.presence_of_all_elements_located((By.XPATH, './dd/span/a'))):
# 文献链接 (href 属性)
href = element.get_attribute('href')
href_list.append(href)
else:
continue
url_dict[theme] = href_list
return url_dict # 关闭浏览器
self.driver.close() def run(self):
url_dict = self.get_url()
# 写入 csv 文件
with open('test.csv', 'a+') as fd:
for key in url_dict.keys():
fd.write(key + '\n')
for value in url_dict.get(key, '不存在'):
fd.write(value + '\n') if __name__ == "__main__":
spider = CnkiSpider()
spider.run()

selenium 根据期刊信息获取知网文献信息 pt.1的更多相关文章

  1. 免费下载知网文献的方法 | sci-hub免费下载SCI论文方法

    部分方法参考自在家里如何免费使用中国知网? - 大学生 - 知乎的回答,已注明出处. 知网文献下载:idata中国知网 idata中国知网网址:idata中国知网 https://www.cn-ki. ...

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

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

  3. 如何快速获取官网帮助信息 (附 11g pdf 文档)

    http://docs.oracle.com/en/ 11g Release 2 (11.2) 搜索时指定网站 site:docs.oracle.com create table site:docs. ...

  4. DA - 信息获取途径汇总

    目的驱动 大多数情况下,都是为了解决某个问题或完成某项任务,才需要进行针对性的.大范围的.细致化的信息获取. 那么,信息获取的方式和来源,就应该紧紧围绕这个"问题和任务"本身来确定 ...

  5. Info - 信息获取途径汇总

    目的驱动 大多数情况下,都是为了解决某个问题或完成某项任务,才需要进行针对性的.大范围的.细致化的信息获取. 那么,信息获取的方式和来源,就应该紧紧围绕这个"问题和任务"本身来确定 ...

  6. 使用selenium模拟知网登录

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

  7. 如何将中国知网CNKI中的文献导入EndNote X6

    如何将中国知网CNKI中的文献导入EndNote X6 下面给出具体步骤: 1.在CNKI中检索目标文献,如检索<基于Qt的三维可视化技术研究> 我喜欢在CNKI(http://www.c ...

  8. (转)js获取内网ip地址,操作系统,浏览器版本等信息

    这次呢,说一下使用js获取用户电脑的ip信息,刚开始只是想获取用户ip,后来就顺带着获取了操作系统和浏览器信息. 先说下获取用户ip地址,包括像ipv4,ipv6,掩码等内容,但是大部分都要根据浏览器 ...

  9. 论文 查重 知网 万方 paperpass

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

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

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

随机推荐

  1. 部署:windows7下mysql8.0.18部署安装

    一.前期准备(windows7+mysql-8.0.18-winx64) 1.下载地址:https://dev.mysql.com/downloads/ 2.选择直接下载不登录账号,下载的压缩包大概两 ...

  2. Get Your Wish

    Get Your Wish (https://www.luogu.com.cn/problem/P7262) 一个模拟题 解读一下题目:简单来说就是在现在重力的方向上,如果有水滴和电子元件就GG,否则 ...

  3. Docker 配置阿里云或腾讯云镜像加速

    1.新建 /etc/docker/daemon.json 文件,并写入以下内容: 阿里云按下面配置 sudo tee /etc/docker/daemon.json <<-'EOF' { ...

  4. 【GPT开发】人人都能用ChatGPT4.0做Avatar虚拟人直播

    0 前言 最近朋友圈以及身边很多朋友都在研究GPT开发,做了各种各样的小工具小Demo,AI工具用起来是真的香!在他们的影响下,我也继续捣鼓GPT Demo,希望更多的开发者加入一起多多交流. 上一篇 ...

  5. Mapstruct使用报java: Couldn't retrieve @Mapper annotation

    检查代码报错 java: Couldn't retrieve @Mapper annotation jar包冲突,去掉一个Mapstructjar包.

  6. 如何借助分布式存储 JuiceFS 加速 AI 模型训练

    传统的机器学习模型,数据集比较小,模型的算法也比较简单,使用单机存储,或者本地硬盘就足够了,像 JuiceFS 这样的分布式存储并不是必需品. 随着近几年深度学习的蓬勃发展,越来越多的团队开始遇到了单 ...

  7. 浅谈ArrayList和LinkedList

    文章目录 前言 ArrayList和LinkedList List的方法 ArrayList add remove LinkedList remove get和peek push ArrayList和 ...

  8. Prism Sample 21-PassingParameters

    这个例子是说明导航中传递参数,类似Asp.net中实现. 例子的模板,是例16中使用regionContext实现过的.在例16中, <Grid x:Name="LayoutRoot& ...

  9. 2023-04-09:使用 Golang 重写的 ffmpeg 示例encode_video.c,实现视频编码并将编码后的数据封装为容器格式,最终写入输出文件。

    2023-04-09:使用 Golang 重写的 ffmpeg 示例encode_video.c,实现视频编码并将编码后的数据封装为容器格式,最终写入输出文件. 答案2023-04-09: 本文介绍的 ...

  10. Accurate SerDes LineRate

    测试现象:(单板A板载7A series,单板B板载7K series) 1. 单板A板载2个type C接口,通过线缆自环,GTP near-end loopback, OK. 2. 2块单板A,使 ...