爬虫 | 【实践】Best Computer Science Scientists数据爬取

news2024/11/18 18:49:46

文章目录

  • 📚数据需求
  • 📚数据爬取
    • 🐇排行榜页数据爬取
    • 🐇获取详情页
    • 🐇目标信息提取
  • 📚完整代码与结果

📚数据需求

  • 姓名,国家,学校
    在这里插入图片描述

  • 最有名研究领域
    在这里插入图片描述

  • 目前研究领域
    在这里插入图片描述

  • 共同作者
    在这里插入图片描述

  • D-index、引用、出版物、世界排名、国家排名
    在这里插入图片描述

📚数据爬取

🐇排行榜页数据爬取

# 以for循环实现翻页,总共20页
for page in range(1, 21):
    # 前缀f表示该字符串是一个格式化字符串,允许我们在字符串中嵌入变量或表达式的值。
    # 这里嵌入变量page,实现翻页后的url对应
    url = f"https://research.com/scientists-rankings/computer-science?page={page}"
    # 获得响应
    response = requests.get(url=url, headers=headers)
    # 智能解码
    response.encoding = response.apparent_encoding
    # 使用etree.HTML函数将HTML文本转换为可进行XPath操作的树结构对象tree。
    tree = etree.HTML(response.text)
    # 提取id为"rankingItems"元素下的所有div子元素的列表
    div_list = tree.xpath('//*[@id="rankingItems"]/div')
  • 定位到id="rankingItems
    在这里插入图片描述
  • 每一个div是每一条排行记录
    在这里插入图片描述

🐇获取详情页

# 循环取出div_list内容
 for i in div_list:
     # 获取当前科学家的详情页地址
     href = 'https://research.com' + i.xpath('.//div//h4/a/@href')[0]
     print(href)
     # 调用等待时间函数,防止宕机
     random_wait()
     # 获得详情页响应
     response_detail = requests.get(url=href, headers=headers)
     # 智能解码
     response.encoding = response.apparent_encoding
     # 使用etree.HTML函数将HTML文本转换为可进行XPath操作的树结构对象tree。
     tree_detail = etree.HTML(response_detail.text)
  • .//div//h4/a/@href获取对应科学家详情页相关信息,通过href = 'https://research.com' + i.xpath('.//div//h4/a/@href')[0]得到详情页url
    在这里插入图片描述
  • 对应详情页url如下所示
    在这里插入图片描述

🐇目标信息提取

  • 姓名
    # 名字,依次找到htm → body → 第1个div → 第2个div → 第1个div → div → h1元素,匹配文本内容
    # .strip()用于去除文本内容两端的空白字符,包括空格、制表符和换行符。
    name = tree_detail.xpath('/html/body/div[1]/div[2]/div[1]/div/h1/text()')[0].strip()
    
    在这里插入图片描述

  • 国家

    country = tree_detail.xpath('/html/body/div[1]/div[2]/div[1]/div/div/p/a[2]/text()')[0].strip()
    

    在这里插入图片描述


  • 学校

    university = tree_detail.xpath('/html/body/div[1]/div[2]/div[1]/div/div/p/a[1]/text()')[0].strip()
    

    在这里插入图片描述


  • 最有名研究领域

    try:
       research_field1 = tree_detail.xpath('//*[@class="tab bg-white shadow"]//ul[1]/li/text()')[0].strip()
        research_field2 = tree_detail.xpath('//*[@class="tab bg-white shadow"]//ul[1]/li/text()')[1].strip()
        research_field3 = tree_detail.xpath('//*[@class="tab bg-white shadow"]//ul[1]/li/text()')[2].strip()
    except:
        # 异常处理,有些详情页无对应数据
        research_field1="无研究领域"
        research_field2="无研究领域"
        research_field3 ="无研究领域"
    

    在这里插入图片描述


  • 目前研究领域

    try:
    # 目前研究领域
        # 将匹配正则表达式pattern的内容替换为空字符串。删除括号及其内部的内容。
        now_research_field1 = re.sub(pattern, '', tree_detail.xpath('//*[@class="tab bg-white shadow"]//ul[4]/li/text()')[0].strip())
        now_research_field2 = re.sub(pattern, '', tree_detail.xpath('//*[@class="tab bg-white shadow"]//ul[4]/li/text()')[1].strip())
        now_research_field3 = re.sub(pattern, '', tree_detail.xpath('//*[@class="tab bg-white shadow"]//ul[4]/li/text()')[2].strip())
    except:
        now_research_field1="无研究领域"
        now_research_field2="无研究领域"
        now_research_field3 ="无研究领域"
    

    在这里插入图片描述


  • 共同作者
    # 共同作者,定位后源码里的第一个div不要
    Frequent_CoAuthors = tree_detail.xpath('/html/body/div[1]/div[4]/div[2]/div/div')[1:]
    # 共同关系的人
    for i in Frequent_CoAuthors:
        common_name = i.xpath('.//h4/a/text()')[0].strip().replace('\n', '')
        friend_list.append(common_name)
    # 将共同关系的人拼成一个字符串
    result = ', '.join(friend_list)
    
    • tree_detail.xpath('/html/body/div[1]/div[4]/div[2]/div/div')[1:]——定位到列表框
      在这里插入图片描述
    • i.xpath('.//h4/a/text()')[0].strip().replace('\n', '')——定位到每个人
      在这里插入图片描述

  • 各项数据、排名等

    # 各项数据,排名等等,[-1:]返回匹配结果列表中的最后一个元素
    data_list = tree_detail.xpath('//*[@id="tab-1"]/div/div')[-1:]
    for a in data_list:
      # D-index
      D_index = a.xpath('.//span[2]//text()')[-1].replace(' ', '').replace('\n', '')
      # 引用
      Citations = a.xpath('.//span[3]//text()')[-1].replace(' ', '').replace('\n', '').replace(',', '')
      # 出版物
      publication = a.xpath('.//span[4]//text()')[-1].replace(' ', '').replace('\n', '').replace(',', '')
      # 世界排名
      world_rank = a.xpath('.//span[5]//text()')[-1].replace(' ', '').replace('\n', '')
      # 国家排名
      national_rank = a.xpath('.//span[6]//text()')[-1].replace(' ', '').replace('\n', '')
    
    • //*[@id="tab-1"]/div/div——定位到数据表格
      在这里插入图片描述

    • a.xpath('.//span[2]//text()')[-1]——D-index 在这里插入图片描述

    • a.xpath('.//span[3]//text()')[-1]——引用
      在这里插入图片描述

    • a.xpath('.//span[4]//text()')[-1]——出版物
      在这里插入图片描述

    • 世界排名和国家排名

       # 世界排名
       world_rank = a.xpath('.//span[5]//text()')[-1].replace(' ', '').replace('\n', '')
       # 国家排名
       national_rank = a.xpath('.//span[6]//text()')[-1].replace(' ', '').replace('\n', '')
      

      在这里插入图片描述

      在这里插入图片描述

📚完整代码与结果

import requests
from lxml import etree
import openpyxl
import re
import random
import time


# 随机等待时间的函数
# 避免以高频率向服务器发送请求造成宕机
def random_wait():
    # 生成一个随机的等待时间,范围为1到5秒
    wait_time = random.uniform(1, 5)
    time.sleep(wait_time)

# openpyxl用于操作Excel文件。它允许我们读取、写入和修改Excel文件中的数据。
# 创建一个新的Excel工作簿对象
workbook = openpyxl.Workbook()
# 返回工作簿中的活动工作表对象,表明之后的代码对这个工作表进行操作
worksheet = workbook.active
# 添加标题
worksheet.append(
    ['姓名', '国家', '学校', '最有名研究领域1', '最有名研究领域2', '最有名研究领域3', '目前研究领域1', '目前研究领域2',
     '目前研究领域3', '共同作者', 'D-index', '引用', '出版物', '世界排名', '国家排名'])

# 伪装请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0'
}

# 以for循环实现翻页,总共20页
for page in range(1, 21):
    # 前缀f表示该字符串是一个格式化字符串,允许我们在字符串中嵌入变量或表达式的值。
    # 这里嵌入变量page,实现翻页后的url对应
    url = f"https://research.com/scientists-rankings/computer-science?page={page}"
    # 获得响应
    response = requests.get(url=url, headers=headers)
    # 智能解码
    response.encoding = response.apparent_encoding
    # 使用etree.HTML函数将HTML文本转换为可进行XPath操作的树结构对象tree。
    tree = etree.HTML(response.text)
    # 提取id为"rankingItems"元素下的所有div子元素的列表
    div_list = tree.xpath('//*[@id="rankingItems"]/div')

    # 循环取出div_list内容
    for i in div_list:
        # 获取当前科学家的详情页地址
        href = 'https://research.com' + i.xpath('.//div//h4/a/@href')[0]
        print(href)
        # 调用等待时间函数,防止宕机
        random_wait()
        # 获得详情页响应
        response_detail = requests.get(url=href, headers=headers)
        # 智能解码
        response.encoding = response.apparent_encoding
        # 使用etree.HTML函数将HTML文本转换为可进行XPath操作的树结构对象tree。
        tree_detail = etree.HTML(response_detail.text)

        # 用于删除括号及其内部的内容,主要是对后边最近研究领域后续括号内的百分比进行删除
        pattern = r'\([^()]*\)'
        # 存取共同作者的列表
        friend_list = []
        try:
            # 名字,依次找到htm → body → 第1个div → 第2个div → 第1个div → div → h1元素,匹配文本内容
            # .strip()用于去除文本内容两端的空白字符,包括空格、制表符和换行符。
            name = tree_detail.xpath('/html/body/div[1]/div[2]/div[1]/div/h1/text()')[0].strip()
            # 国家
            country = tree_detail.xpath('/html/body/div[1]/div[2]/div[1]/div/div/p/a[2]/text()')[0].strip()
            # 学校
            university = tree_detail.xpath('/html/body/div[1]/div[2]/div[1]/div/div/p/a[1]/text()')[0].strip()
            # 最有名研究领域
            try:
                research_field1 = tree_detail.xpath('//*[@class="tab bg-white shadow"]//ul[1]/li/text()')[0].strip()
                research_field2 = tree_detail.xpath('//*[@class="tab bg-white shadow"]//ul[1]/li/text()')[1].strip()
                research_field3 = tree_detail.xpath('//*[@class="tab bg-white shadow"]//ul[1]/li/text()')[2].strip()
            except:
                # 异常处理,有些详情页无对应数据
                research_field1="无研究领域"
                research_field2="无研究领域"
                research_field3 ="无研究领域"
            try:
            # 目前研究领域
                # 将匹配正则表达式pattern的内容替换为空字符串。删除括号及其内部的内容。
                now_research_field1 = re.sub(pattern, '', tree_detail.xpath('//*[@class="tab bg-white shadow"]//ul[4]/li/text()')[0].strip())
                now_research_field2 = re.sub(pattern, '', tree_detail.xpath('//*[@class="tab bg-white shadow"]//ul[4]/li/text()')[1].strip())
                now_research_field3 = re.sub(pattern, '', tree_detail.xpath('//*[@class="tab bg-white shadow"]//ul[4]/li/text()')[2].strip())
            except:
                now_research_field1="无研究领域"
                now_research_field2="无研究领域"
                now_research_field3 ="无研究领域"
                
            # 共同作者,定位后源码里的第一个div不要
            Frequent_CoAuthors = tree_detail.xpath('/html/body/div[1]/div[4]/div[2]/div/div')[1:]
            # 共同关系的人
            for i in Frequent_CoAuthors:
                common_name = i.xpath('.//h4/a/text()')[0].strip().replace('\n', '')
                friend_list.append(common_name)
            # 将共同关系的人拼成一个字符串
            result = ', '.join(friend_list)

            # 各项数据,排名等等,[-1:]返回匹配结果列表中的最后一个元素
            data_list = tree_detail.xpath('//*[@id="tab-1"]/div/div')[-1:]
            for a in data_list:
                # D-index
                D_index = a.xpath('.//span[2]//text()')[-1].replace(' ', '').replace('\n', '')
                # 引用
                Citations = a.xpath('.//span[3]//text()')[-1].replace(' ', '').replace('\n', '').replace(',', '')
                # 出版物
                publication = a.xpath('.//span[4]//text()')[-1].replace(' ', '').replace('\n', '').replace(',', '')
                # 世界排名
                world_rank = a.xpath('.//span[5]//text()')[-1].replace(' ', '').replace('\n', '')
                # 国家排名
                national_rank = a.xpath('.//span[6]//text()')[-1].replace(' ', '').replace('\n', '')
                print(name, country, university, research_field1, research_field2, research_field3, now_research_field1,
                      now_research_field2, now_research_field3, result, D_index, Citations, publication, world_rank, national_rank)
            # 清空列表
            friend_list.clear()
            # 将数据添加到excel表格内
            worksheet.append(
                [name, country, university, research_field1, research_field2, research_field3, now_research_field1,
                 now_research_field2, now_research_field3, result, D_index, Citations, publication, world_rank, national_rank])
            # 保存
            workbook.save('world_data.csv')
        except:
            worksheet.append(
                ['无数据', '无数据', '无数据', '无数据', '无数据', '无数据', '无数据', '无数据', '无数据', '无数据', '无数据', '无数据', '无数据', '无数据', '无数据'])
            # 保存
            workbook.save('world_data.csv')

在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1095451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

16 | 如何自定义 HandlerMethodArgumentResolvers

上一讲我们介绍了 SpringDataWebConfiguration 类的用法,那么这次我们来看一下这个类是如何被加载的,PageableHandlerMethodArgumentResolver 和 SortHandlerMethodArgumentResolver 又是如何生效的,以及如何定义自己的 HandlerMethodArgumen…

c语言练习89:链表的使用

链表的使用 虽然有这么多的链表的结构,但是我们实际中最常⽤还是两种结构: 单链表 和 双向带头循环链表 1. ⽆头单向⾮循环链表:结构简单,⼀般不会单独⽤来存数据。实际中更多是作为其他数据结 构的⼦结构,如哈希桶、…

数据结构与算法—单链表

目录 一、链表 1、链表的概念及结构 2、分类 二、实现单向链表 1、声明链表结构体 2、输出 3、头插&尾插 4、头删尾删 5、查找 6、指定位置插入 7、删除指定节点 8、删除指定节点的后一个节点 9、单链表的销毁 完整版 LList.h LList.c text.c 一、链表 …

Go错误处理方式真的不好吗?

平时经常上一些网络平台阅读一些技术讨论的话题,对Go语言方面也有些浅浅的关注,正如标题所问,Go语言错误处理可以说算是网络上开发中对Go语言吐槽最多的点之一,那么,Go错误处理真的很不堪吗? 对此我认为&a…

CANoe制作网关实现CAN(FD)报文故障注入(报文长度/timeout/信号错误/E2E)1

CANoe制作网关实现CAN报文故障注入(报文长度/timeout/信号错误/E2E) 文章目录 CANoe制作网关实现CAN报文故障注入(报文长度/timeout/信号错误/E2E)1.基本介绍和实现功能 1.基本介绍和实现功能 下面是一个完整的CAN/CANFD总线&…

【Wifi】Wifi架构介绍

Wifi架构介绍 本文基于Android介绍其Wifi架构。Wifi是许多操作系统提供的重要功能之一,特别是越来越多的车载系统wifi是其必备功能。为啥wifi是必备功能? 一方面是传统的上网(现在有些车载使用DCM模块管理网络),另一方…

项目管理软件中注释功能的作用是什么?

在项目管理软件中,注释功能允许您对任务、文件夹和项目进行详细的标注。这一功能不仅便于团队成员之间的沟通与协作,还能提高项目管理的效率。通过在项目中添加评论,您可以及时了解项目的最新动态,提出疑问并寻求解决方案。此外&a…

【大模型应用开发教程】01_大模型简介

C1 大模型简介 一. 什么是LLM(大语言模型)?1. 发展历程2. 大语言模型的概念LLM的应用和影响 二、大模型的能力和特点1. 大模型的能力1.1 涌现能力(emergent abilities)1.2 作为基座模型支持多元应用的能力1.3 支持对话…

AN基础工具——填色工具

【AN基础工具——填色工具】 基本使用方法填色补充给色块周围画上线 变色动画渐变变色的蜥蜴 本篇内容:填色动画制作 重点内容:填色工具 工 具:Adobe Animate 2022 基本使用方法 填色补充 之前说图形要封闭才能填色,实际情况是有…

ESP8266 Node Mcu开发板连接WIFI并上报数据到MQTT服务器——物联网应用开发

一、前言 本文主要介绍关于ESP8266 Node Mcu开发板如何连接WIFI并将本地采集的数据上传到MQTT服务器中。 大家调试可以使用MQTTBox 二、WIFI连接 首先&#xff0c;导入WIFI连接所需的头文件&#xff0c;引入所需库。 #include <ESP8266WiFi.h> 声明字符串常量&#xff0…

3.1 模板测试与深度测试(Stencil Test Z Test)

一、模板测试&#xff08;Stencil Test&#xff09; 模板测试可以实现的一些效果图 1.是什么 ①从渲染管线出发&#xff1a;模板测试是在逐片源操作阶段&#xff0c;透明测试之后&#xff0c;深度测试之前的位置。 ②从书面概念上理解 说到模板测试&#xff0c;就要先说道模…

Java设计模式-结构性设计模式(享元设计模式)

简介 属于结构型模式&#xff0c;主要⽤于减少创建对象的数量&#xff0c;以减少内存占⽤和提⾼性能&#xff0c; 它提供了减少对象数量从⽽改善应⽤所需的对象结构的⽅式享元模式尝试重⽤现有的同类对象&#xff0c;如果未找到匹配的对象&#xff0c;则创建新对象应用场景 JAV…

C语言天花板——指针(进阶1)

接上次的指针初阶&#xff08;http://t.csdnimg.cn/oox5s&#xff09;&#xff0c;这次我们继续的探寻指针的奥秘&#xff0c;发车咯&#xff01;&#xff01;&#xff01;&#x1f697;&#x1f697;&#x1f697; 一、字符指针 可以看到我们将指针p给打印出来&#xff0c;就是…

LDA(Fisher)线性判别分析

LDA&#xff08;Fisher&#xff09;线性判别分析 对于二分类问题若存在一个 y i W x i y_iWx_i yi​Wxi​将样本 X \pmb X X投影到一维空间上 为了使两个样本能够较好的分开&#xff0c;应该是的每一个同类的样本的方差&#xff08;离散程度&#xff09;尽可能的小&#xff0…

Java实现hack汇编器

Hack汇编语言是一种特定于计算机体系结构的汇编语言&#xff0c;使用Hack架构的机器码指令来编写程序。Hack是一种基于Von Neumann结构的计算机体系结构&#xff0c;由Harvard大学的Nand to Tetris项目开发出来&#xff0c;用于实现计算机硬件和软件。 Hack汇编语言主要用于在…

FPGA面试题(5)

一.FPGA可以综合实现为RAM/ROM/CAM的三种资源及注意事项 三种资源&#xff1a;BLOCK RAM&#xff0c;触发器&#xff08;FF&#xff09;&#xff0c;查找表&#xff08;LUT&#xff09; 注意事项&#xff1a; 1.生成RAM&#xff0c;首选BLOCK RAM。因为BLOCK RAM是已经存在的“…

Jmeter压测http接口和java代码放在Jmeter执行

Jmeter无缝支持java语言&#xff0c;使其在市场上有很高的占有率&#xff0c;一些公司还专门对JMenter进行二次开发&#xff0c;使其成为公司级压测平台。 本次介绍JMenter的一些入门级使用&#xff0c;方便大家继续深入探索。 1、启动Jmeter 2、压测简单http接口 添加线程组…

Ant Design Vue设置表格滚动 宽度自适应 不换行

Ant Design Vue设置表格滚动 宽度自适应 不换行 添加以下属性即可解决这个问题&#xff1a; <a-table :columns"columns" :data-source"list":pagination"false"bordered:scroll"{ x: max-content }" >

Lazysysadmin靶机

信息收集 主机发现 nmap -sn 192.168.88.0/24 //-sn&#xff1a;制作主机发现&#xff0c;不做端口扫描&#xff1b;扫描结果包含本机IP 端口扫描 nmap --min-rate 10000 -p- 192.168.88.136 扫描端口详细信息 端口扫描发现&#xff0c;该主机的22、80、139、445、3306、…

进阶JAVA篇- DateTimeFormatter 类与 Period 类、Duration类的常用API(八)

目录 1.0 DateTimeFormatter 类的说明 1.1 如何创建格式化器的对象呢&#xff1f; 1.2 DateTimeFormatter 类中的 format&#xff08;LocalDateTime ldt&#xff09; 实例方法 2.0 Period 类的说明 2.1 Period 类中的 between(localDate1,localDate2) 静态方法来创建对象。 3.…