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 ...
随机推荐
- shopee V2 接口 虾皮货代打包贴单仓储系统,独立部署,系统源码 终身使用,没有任何隐形收费,想怎么用就怎么用 直接就已经对接好了的接口。
shopee V2 接口 虾皮货代打包贴单仓储系统,独立部署,系统源码 终身使用,没有任何隐形收费,想怎么用就怎么用 直接就已经对接好了的接口. 虾皮货代打包 系统虾皮代贴单系统 虾皮跨境平台源码 ...
- 基于Python的爬虫案例
案例1:使用爬虫爬取京东华为手机用户评论 本案例借鉴哔哩哔哩博客主视频教程,感谢其教程为我开启了爬虫之旅:https://www.bilibili.com/video/BV1Yt4y1Y7nt?t=3 ...
- DeFi-W3
Gas Fee 每一笔交易都会产生Gas Fee. GWei ETH的最小单位 出价(gas fee)的高低会影响交易上联的速度,越快就价格越高. gas fee是跟具体的计算量有关的 Smart c ...
- react项目使用less样式,配置less
create-react-app脚手架创建的项目有sass配置项,使用的时候只需要装包即可,下面是less使用的方法 由于 create-react-app 脚手架中并没有配置关于 less 文件的解 ...
- vue刷新当前组件的方法
一:v-if控制组件,先设false,再true强制刷新组件(有时会产生一种奇怪的效果) 1 <medical-record v-if="fresh" /> 2 3 t ...
- Python学习——Juptyer Notebook快捷键的使用
1. 运行当前Cell:Ctrl + Enter 2. 运行当前Cell并在其下方插入一个新的Cell:Alt + Enter 3. 运行当前Cell并选中其下方的Cell:Shift + Enter ...
- git仓库过渡,同时向两个仓库推送代码
公司部门被大佬收购,产品项目迁移新公司仓库,过渡期间产品上线流程继续使用原公司的,新公司部署新系统后通过域名重定向逐渐将用户引流到新系统上完成切换,最后关闭原公司系统及上线流程. 过渡期间新功能代码需 ...
- 2022-12-10:给你一个由小写字母组成的字符串 s ,和一个整数 k 如果满足下述条件,则可以将字符串 t 视作是 理想字符串 : t 是字符串 s 的一个子序列。 t 中每两个 相邻 字母在字
2022-12-10:给你一个由小写字母组成的字符串 s ,和一个整数 k 如果满足下述条件,则可以将字符串 t 视作是 理想字符串 : t 是字符串 s 的一个子序列. t 中每两个 相邻 字母在字 ...
- upload-labs 第一关 前端验证绕过!
打开靶场发现只能上传jpg png gif 的文件格式的文件,我们想要上传上去的文件格式为php文件格式,首先在Notepad++里面打开图片,会出现很多乱码,我们在最后面添加漏洞语句<?php ...
- C温故补缺(十八):网络编程
计算机网络 参考:TCP三次握手详解. OSI模型 简单分层: 其中,链路层还可以分出物理层和数据链路层.应用层可以分出会话层,表示层和应用层. 七层模型: 链路层:只是物理的比特流和简单封装的数据帧 ...