selenium 根据期刊信息获取知网文献信息 pt.1
哈喽大家好,我是咸鱼
之前写过一篇获取知网文献信息的文章(关于《爬取知网文献信息》中代码的一些优化),看了下后台数据还挺不错
所以咸鱼决定再写一篇知网文献信息爬取的文章
需要注意的是文章只是针对某一特定期刊的爬取,希望小伙伴们把关注点放在如何分析网页以及如何定位元素上面
这样就能写出适合自己的爬虫代码了,而不是照搬我的
网址链接: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的更多相关文章
- 免费下载知网文献的方法 | sci-hub免费下载SCI论文方法
部分方法参考自在家里如何免费使用中国知网? - 大学生 - 知乎的回答,已注明出处. 知网文献下载:idata中国知网 idata中国知网网址:idata中国知网 https://www.cn-ki. ...
- Python爬取中国知网文献、参考文献、引证文献
前两天老师派了个活,让下载知网上根据高级搜索得到的来源文献的参考文献及引证文献数据,网上找了一些相关博客,感觉都不太合适,因此特此记录,希望对需要的人有帮助. 切入正题,先说这次需求,高级搜索,根据中 ...
- 如何快速获取官网帮助信息 (附 11g pdf 文档)
http://docs.oracle.com/en/ 11g Release 2 (11.2) 搜索时指定网站 site:docs.oracle.com create table site:docs. ...
- DA - 信息获取途径汇总
目的驱动 大多数情况下,都是为了解决某个问题或完成某项任务,才需要进行针对性的.大范围的.细致化的信息获取. 那么,信息获取的方式和来源,就应该紧紧围绕这个"问题和任务"本身来确定 ...
- Info - 信息获取途径汇总
目的驱动 大多数情况下,都是为了解决某个问题或完成某项任务,才需要进行针对性的.大范围的.细致化的信息获取. 那么,信息获取的方式和来源,就应该紧紧围绕这个"问题和任务"本身来确定 ...
- 使用selenium模拟知网登录
之前都是用phantomjs和selenium模拟浏览器动作的,后来phantomjs不再更新,就转用chrome了 本次模拟登录的网站是中国知网http://login.cnki.net/login ...
- 如何将中国知网CNKI中的文献导入EndNote X6
如何将中国知网CNKI中的文献导入EndNote X6 下面给出具体步骤: 1.在CNKI中检索目标文献,如检索<基于Qt的三维可视化技术研究> 我喜欢在CNKI(http://www.c ...
- (转)js获取内网ip地址,操作系统,浏览器版本等信息
这次呢,说一下使用js获取用户电脑的ip信息,刚开始只是想获取用户ip,后来就顺带着获取了操作系统和浏览器信息. 先说下获取用户ip地址,包括像ipv4,ipv6,掩码等内容,但是大部分都要根据浏览器 ...
- 论文 查重 知网 万方 paperpass
相信各个即将毕业的学生或在岗需要评职称.发论文的职场人士,论文检测都是必不可少的一道程序.面对市场上五花八门的检测软件,到底该如何选择?选择查重后到底该如何修改?现在就做一个知识的普及.其中对于中国的 ...
- Python开源爬虫项目代码:抓取淘宝、京东、QQ、知网数据--转
数据来源:数据挖掘入门与实战 公众号: datadw scrapy_jingdong[9]- 京东爬虫.基于scrapy的京东网站爬虫,保存格式为csv.[9]: https://github.co ...
随机推荐
- Nuxtjs实现服务端渲染和静态化站点
本文将介绍如何使用Nuxtjs对vue项目进行ssr和静态化处理. Nuxtjs简单介绍 首先,我们简单了解下Nuxtjs框架,Nuxt.js是一个基于Vue的通用框架,主要用于解决Vue项目的服务端 ...
- 解决IDEA创建项目时无法引入依赖问题:Cannot resolve **.**.**(已解决)
今天在创建SpringBoot整合MyBatis项目时出现报错: Cannot resolve org.springframework:spring-tx:5.3.26 Cannot resolve ...
- 解决flex布局中justify-content设置成space-between后因数据问题导致最后一行布局错乱
在常用的flex布局中,当页面展示商品时,因为数据的不确定,导致justify-content设置成space-between,最后一行布局错乱 1 <!DOCTYPE html> 2 & ...
- win10启动docker报错,错误码 0xffffffff
一.注册表修复(如果有就不用管) 在\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Ca ...
- Mybatis 坑(1)
org.apache.ibatis.executor.ExecutorException: No constructor found in xxxx [Integer,String] 这种情况一般是类 ...
- react之todoList基础小项目
1.项目最终成品和项目目录快照如图: 2.context.js文件 // 使用context进行多级传递数据 // 1. createContext 创建一个可以多级传递的context数据 // 2 ...
- 2023-03-24:音视频mp3和h264混合(muxer)编码为mp4,用go语言编写。
2023-03-24:音视频mp3和h264混合(muxer)编码为mp4,用go语言编写. 答案2023-03-24: 这是一个使用FFmpeg库将MP3和H.264混合编码为MP4的Go语言程序. ...
- 2022-11-11:设计一个最大栈数据结构,既支持栈操作,又支持查找栈中最大元素。 实现 MaxStack 类: MaxStack() 初始化栈对象 void push(int x) 将元素 x 压
2022-11-11:设计一个最大栈数据结构,既支持栈操作,又支持查找栈中最大元素. 实现 MaxStack 类: MaxStack() 初始化栈对象 void push(int x) 将元素 x 压 ...
- Element-DatePicker的宽度
Element如何修改DatePicker的宽度 方法/步骤 1 打开一个vue文件,添加DatePicker日期选择器组件,设置默认日期为null.如图 2 在组件上添加style样式属性,设置wi ...
- 【论文笔记】Deeplab系列
[深度学习]总目录 DeepLab系列是谷歌团队提出的一系列语义分割算法.DeepLab v1于2014年推出,随后2017到2018年又相继推出了DeepLab v2,DeepLab v3以及Dee ...