python爬虫之根据期刊信息获取知网文献信息 pt.1

python,爬虫,根据,期刊,信息,获取,文献,pt · 浏览次数 : 46

小编点评

**如何分析网页并定位元素?** 1. **分析年份元素路径:** - 使用 XPath 选择与年份元素相关的元素的 XPath 路径。 - 遍历所有元素并获取其文本内容。 2. **定位期数元素:** - 使用 XPath 选择与期数元素相关的元素的 XPath 路径。 - 遍历所有元素并获取其文本内容。 3. **获取文章链接:** - 在每个期数元素中查找所有与文献标题相关的元素。 - 从元素中提取文献标题的链接。 4. **判断大标题是否存在:** - 在每个文章元素中查找所有与大标题相关的元素。 - 如果找到了大标题元素,则获取它的文本内容。 5. **获取对应期数的文献链接:** - 如果找到了大标题元素,则继续遍历其子元素,直到找到与期数元素相关的元素。 - 从元素中提取其文本内容,这是一个对应期数的文献链接。 6. **判断是否获取到文章链接:** - 如果找到了所有对应期数的文献链接,则表示已成功获取到所有文章链接。 - 否则,说明该页面没有与期数相关的文章,需要继续遍历其他元素。

正文

哈喽大家好,我是咸鱼

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

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

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

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

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

需求分析

我们来分析下网页结构
image

由上图可得知:

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

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

image

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

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

首先点击年份 2022,然后依次点击期数(No.06、No.05.....)
image
我们每点击一次期数,然后就爬取对应期数下面的文献链接,并用大标题分类

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

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

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

元素定位

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

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

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

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

image

得到定位路径如下:

# 期数 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()

与python爬虫之根据期刊信息获取知网文献信息 pt.1相似的内容:

python爬虫之根据期刊信息获取知网文献信息 pt.1

哈喽大家好,我是咸鱼 之前写过一篇获取知网文献信息的文章([关于《爬取知网文献信息》中代码的一些优化](http://mp.weixin.qq.com/s?__biz=MzkzNzI1MzE2Mw==&mid=2247485617&idx=1&sn=8c38163fc757784d3048e5043

python教程8-页面爬虫

python爬虫常用requests和beautifulSoup这2个第三方模块。需要先进行手动安装。 requests负责下载页面数据,beautifulSoup负责解析页面标签。 关于beautifulSoup的api使用,详见api页面:https://beautifulsoup.readth

Python 爬虫实战:驾驭数据洪流,揭秘网页深处

**爬虫,这个经常被人提到的词,是对数据收集过程的一种形象化描述。特别是在Python语言中,由于其丰富的库资源和良好的易用性,使得其成为编写爬虫的绝佳选择。本文将从基础知识开始,深入浅出地讲解Python爬虫的相关知识,并分享一些独特的用法和实用技巧。本文将以实际的网站为例,深入阐述各个处理部分,

Python爬虫(二):写一个爬取壁纸网站图片的爬虫(图片下载,词频统计,思路)

好家伙,写爬虫 代码: import requests import re import os from collections import Counter import xlwt # 创建Excel文件 workbook = xlwt.Workbook(encoding='utf-8') wor

Python爬虫-王者荣耀英雄图片爬取

王者荣耀英雄图片爬取 pyquery库 https://pyquery.readthedocs.io/en/latest/ 官方文档 https://github.com/gawel/pyquery github pyquery实际上是python中的jquery 安装 pip install py

Python爬虫-爬取小说

Python爬虫-爬取小说 代码 import os from pyquery import PyQuery as pq # 1. 配置爬取信息: 待爬取网站、小说的url、小说名字 website = 'https://www.bbiquge.net' novel_url = '/book/133

python 爬虫某东网商品信息 | 没想到销量最高的是

哈喽大家好,我是咸鱼 好久没更新 python 爬虫相关的文章了,今天我们使用 selenium 模块来简单写个爬虫程序——爬取某东网商品信息 网址链接:https://www.jd.com/ 完整源码在文章最后 ## 元素定位 我们需要找到网页上元素的位置信息(xpth 路径) ![image](

通过模仿学会Python爬虫(一):零基础上手

好家伙,爬虫来了 爬虫,这玩意,不会怎么办, 诶,先抄一份作业回来 1.别人的爬虫 Python爬虫史上超详细讲解(零基础入门,老年人都看的懂)_ChenBinBini的博客-CSDN博客 # -*- codeing = utf-8 -*- from bs4 import BeautifulSoup

关于文章《爬取知网文献信息》中代码的一些优化

哈喽大家好,我是咸鱼 之前写了一篇关于文献爬虫的文章Python爬虫实战(5) | 爬取知网文献信息 文章发布之后有很多小伙伴给出了一些反馈和指正,在认真看了小伙伴们的留言之后,咸鱼对代码进行了一些优化 优化的代码在文末,欢迎各位小伙伴给出意见和指正 问题 pycharm 设置 Edge 驱动器的环

只听过 Python 做爬虫?不瞒你说 Java 也很强

网络爬虫技术,早在万维网诞生的时候,就已经出现了,今天我们就一起来揭开它神秘的面纱! 一、摘要 说起网络爬虫,相信大家都不陌生,又俗称网络机器人,指的是程序按照一定的规则,从互联网上抓取网页,然后从中获取有价值的数据,随便在网上搜索一下,排在前面基本都是 pyhton 教程介绍。 的确,pyhton