当前位置: 首页 > news >正文

python爬虫基础实验:通过DBLP数据库获取数据挖掘顶会KDD在2023年的论文收录和相关作者信息

Task1

在这里插入图片描述

读取网站主页整个页面的 html 内容并解码为文本串(可使用urllib.request的相应方法),将其以UTF-8编码格式写入page.txt文件。

Code1

import urllib.requestwith urllib.request.urlopen('https://dblp.dagstuhl.de/db/conf/kdd/kdd2023.html') as response:html = response.read()html_text = html.decode()with open('page.txt','w',encoding='utf-8') as f:f.write(html_text)

Task2

打开page.txt文件,观察 Track 名称、论文标题等关键元素的组成规律。从这个文本串中提取各Track 的名称并输出(可利用字符串类型的split()和strip()方法)。

Code2

import rewith open('page.txt', 'r', encoding='utf-8') as f:content = f.read()# 使用正则表达式找到所有的 <h2 id="*"> 和 </h2> 之间的字符串
matches = re.findall(r'<h2 id=".*?">(.*?)</h2>', content)for match in matches:print(match)

Task3

可以看到, “Research Track Full Papers” 和 “Applied Data Track Full Papers” 中的论文占据了绝大多数,现欲提取这两个 Track 下的所有论文信息(包含作者列表authors、论文标题title、收录起始页startPage与终止页endPage),并按照以下格式存储到一个字典列表中,同时输出这两个 Track 各自包含的论文数量,然后把字典列表转化为 json 对象(可使用json包的相应方法),并以 2 字符缩进的方式写入kdd23.json文件中。

[{"track": "Research Track Full Papers","papers": [{"authors": ["Florian Adriaens","Honglian Wang","Aristides Gionis"],"title": "Minimizing Hitting Time between Disparate Groups with Shortcut Edges.","startPage": "1","endPage": "10"},...]}{"track": "Applied Data Track Full Papers","papers": [{"authors": ["Florian Adriaens","Honglian Wang","Aristides Gionis"],"title": "Minimizing Hitting Time between Disparate Groups with Shortcut Edges.","startPage": "1","endPage": "10"},...]}
]

Code3

import re
import jsonwith open('page.txt', 'r', encoding='utf-8') as f:content = f.read()# 定义一个列表来存储 Track 信息
tracks = []# 定义正则表达式
track_pattern = re.compile(r'<h2 id=".*?">(.*?)</h2>')
author_pattern = re.compile(r'<span itemprop="name" title=".*?">(.*?)</span>')
title_pattern = re.compile(r'<span class="title" itemprop="name">(.*?)</span>')
page_pattern = re.compile(r'<span itemprop="pagination">(.*?)-(.*?)</span>')# 找到 "Research Track Full Papers" 和 "Applied Data Science Track Full Papers" 的位置
start1 = content.find('Research Track Full Papers') - 50
start2 = content.find('Applied Data Track Full Papers') - 50
start3 = content.find('Hands On Tutorials') - 1
end = len(content)# 从整篇文本中划分出前两个Track中所有相邻"<cite"和"</cite>"之间的内容(即一篇文章的范围)
research_papers_content = re.split('<cite', content[start1:start2])[1:]
applied_papers_content = re.split('<cite', content[start2:start3])[1:]def extract_paper_info(papers_content):papers = []for paper_content in papers_content:paper_content = re.split('</cite>', paper_content)[0]papers.append(paper_content)return papersspit_research_content = extract_paper_info(research_papers_content)
spit_applied_content = extract_paper_info(applied_papers_content)# 提取每篇paper的author、title和startPage, endPage
def extract_paper_info(papers_content):papers = []for paper_content in papers_content:authors = author_pattern.findall(paper_content)titles = title_pattern.findall(paper_content)pages = page_pattern.search(paper_content)startPage, endPage = pages.groups()papers.extend([{'authors': authors, 'title': title , 'startPage': startPage , 'endPage': endPage} for title in titles])return papers# 提取 "Research Track Full Papers" 的论文信息
research_track = track_pattern.search(content[start1:start2]).group(1)
research_papers = extract_paper_info(spit_research_content)# 提取 "Applied Data Science Track Full Papers" 的论文信息
applied_track = track_pattern.search(content[start2:start3]).group(1)
#applied_papers = extract_paper_info(spit_applied_content)
applied_papers = extract_paper_info(spit_applied_content)
# 将论文信息存储到字典列表中
tracks.append({'track': research_track, 'papers': research_papers})
tracks.append({'track': applied_track, 'papers': applied_papers})# 将字典列表转换为 JSON 并写入文件
with open('kdd23.json', 'w', encoding='utf-8') as f:json.dump(tracks, f, indent=2)

Task4

基于之前爬取的页面文本,分别针对这两个 Track 前 10 篇论文的所有相关作者,爬取他们的以下信息:(1)该研究者的学术标识符orcID(有多个则全部爬取);(2)该研究者从 2020 年至今发表的所有论文信息(包含作者authors、标题title、收录信息publishInfo和年份year)。将最终结果转化为 json 对象,并以 2 字符缩进的方式写入researchers.json文件中,相应存储格式为:

[{"researcher": "Florian Adriaens","orcID": ["0000-0001-7820-6883"],"papers": [{"authors": ["Florian Adriaens","Honglian Wang","Aristides Gionis"],"title": "Minimizing Hitting Time between Disparate Groups with Shortcut Edges.","publishInfo": "KDD 2023: 1-10","year": 2023},...]},...
]   

Code4

import re
import requests
import json
import time
import random# 打开并读取 "page.txt" 文件
with open('page.txt', 'r', encoding='utf-8') as f:content = f.read()# 定义正则表达式
author_link_pattern = re.compile(r'<span itemprop="author" itemscope itemtype="http://schema.org/Person"><a href="(.*?)" itemprop="url">')
orcID_pattern = re.compile(r'<img alt="" src="https://dblp.dagstuhl.de/img/orcid.dark.16x16.png" class="icon">(.{19})</a></li>')
researcher_pattern = re.compile(r'<head><meta charset="UTF-8"><title>dblp: (.*?)</title>')
year_pattern = re.compile(r'<span itemprop="datePublished">(.*?)</span>')# 找到 "Research Track Full Papers" 和 "Applied Data Track Full Papers" 的位置
start1 = content.find('Research Track Full Papers')
start2 = content.find('Applied Data Track Full Papers')
end = len(content)# 提取这两个部分的内容,并找到前 10 个 "persistent URL:" 之间的内容
research_papers_content = content[start1:start2].split('<cite')[1:11]
applied_papers_content = content[start2:end].split('<cite')[1:11]def extract_paper_info(papers_content):papers = []for paper_content in papers_content:paper_content = re.split('</cite>', paper_content)[0]papers.append(paper_content)return papersspit_research_content = extract_paper_info(research_papers_content)
spit_applied_content = extract_paper_info(applied_papers_content)def extract_paper_info2(paper_content):final_result = []# 使用正则表达式找到所有在 "<>" 之外的字符串outside_brackets = re.split(r'<[^>]*>', paper_content)# 遍历提取到的内容,删除含有'http'的字符串及其前面的字符串flag = -1for i in range(len(outside_brackets)):if 'http' in outside_brackets[i]:flag = ifor i in range(flag + 1 , len(outside_brackets)):if outside_brackets[i]:final_result.append(outside_brackets[i])return final_result# 定义一个列表来存储研究者信息
researchers = []# 访问每篇文章里所有作者的链接,获取作者的 orcID 和论文信息
for papers in [research_papers_content, applied_papers_content]:for paper in papers:author_links = author_link_pattern.findall(paper)for link in author_links:link_content = requests.get(link)response = link_content.text#爬虫时频繁请求服务器,可能会被网站认定为攻击行为并报错"ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接",故采取以下两个措施#使用完后关闭响应link_content.close()  # 在各个请求之间添加随机延时等待time.sleep(random.randint(1, 3))researcher = researcher_pattern.search(response).group(1)orcID = orcID_pattern.findall(response)# 找到 "<li class="underline" title="jump to the 2020s">" 和 "<li class="underline" title="jump to the 2010s">" 之间的内容start = response.find('2020 &#8211; today')end = response.find('<header id="the2010s" class="hide-head h2">')# 提取这部分的内容,并找到所有 "</cite>" 之间的内容papers_content = response[start:end].split('</cite>')[0:-1]papers_dict = []for paper_content in papers_content:spit_content = extract_paper_info2(paper_content)year = int(year_pattern.search(paper_content).group(1))authors = []publishInfo = []for i in range(0 , len(spit_content) - 1):if spit_content[i] != ", " and (spit_content[i+1] == ", " or spit_content[i+1] == ":"):authors.append(spit_content[i])elif spit_content[i][-1] == '.':title = spit_content[i]for k in range(i+2 , len(spit_content)):publishInfo.append(spit_content[k])# 创建一个新的字典来存储每篇文章的信息paper_dict = {'authors': authors, 'title': title, 'publishInfo': ''.join(publishInfo), 'year': year}papers_dict.append(paper_dict)researchers.append({'researcher': researcher, 'orcID': orcID, 'papers': papers_dict})# 将字典列表转换为 JSON 并写入 "researchers.json" 文件
with open('researchers.json', 'w', encoding='utf-8') as f:json.dump(researchers, f, indent=2)

相关文章:

python爬虫基础实验:通过DBLP数据库获取数据挖掘顶会KDD在2023年的论文收录和相关作者信息

Task1 读取网站主页整个页面的 html 内容并解码为文本串&#xff08;可使用urllib.request的相应方法&#xff09;&#xff0c;将其以UTF-8编码格式写入page.txt文件。 Code1 import urllib.requestwith urllib.request.urlopen(https://dblp.dagstuhl.de/db/conf/kdd/kdd202…...

简单记录一次帮维修手机经历(Vivo x9)

简介 手边有一台朋友亲戚之前坏掉的Vivo X9手机&#xff0c; 一直说要我帮忙修理一下&#xff0c; 我一直是拒绝的&#xff0c; 因为搞程序的不等于维修的&#xff08;会电脑不等于维修电器&#xff09;&#xff0c;不知道这种思路如何根深蒂固的&#xff0c;不过好吧&#xff…...

ap聚类是什么

AP聚类&#xff08;Affinity Propagation clustering&#xff09;是一种聚类算法&#xff0c;它基于数据点之间的相似度进行聚类。AP聚类算法无需预先指定簇的数量&#xff0c;而是根据数据点之间的相似性动态地确定簇的个数和分配情况。 AP聚类的核心思想是通过迭代计算数据点…...

C数据类型(C语言)---变量的类型决定了什么?

目录 数据类型&#xff08;Data Type&#xff09; 变量的类型决定了什么&#xff1f; &#xff08;1&#xff09;不同类型数据占用的内存大小不同 如何计算变量或类型占内存的大小 &#xff08;2&#xff09;不同数据类型的表数范围不同 &#xff08;3&#xff09;不同类型…...

axios、axios二次封装、api解耦

import axios from axios// 环境的切换切换测试与生产环境 if (process.env.NODE_ENV development) { axios.defaults.baseURL /api; } else if (process.env.NODE_ENV debug) { axios.defaults.baseURL ; } else if (process.env.NODE_ENV production) { axios.…...

HTML 特殊元素:展示PDF、展示JSON 数据

<pre> 标签 (preformatted text) <pre> 标签用来表示预格式化的文本内容 在页面数据展示时&#xff0c;后端返回了一段未经处理的JSON 数据&#xff0c;将这段数据在页面正常展示&#xff0c;让可读性更高。 {/"project": {/ "title": "…...

算法·动态规划Dynamic Programming

很多人听到动态规划或者什么dp数组了&#xff0c;或者是做到一道关于动态规划的题目时&#xff0c;就会有一种他很难且不好解决的恐惧心理&#xff0c;但是如果我们从基础的题目开始深入挖掘动规思想&#xff0c;在后边遇到动态规划的难题时就迎难而解了。  其实不然&#xff…...

鸿蒙Harmony应用开发—ArkTS-转场动画(共享元素转场)

当路由进行切换时&#xff0c;可以通过设置组件的 sharedTransition 属性将该元素标记为共享元素并设置对应的共享元素转场动效。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 属性 名称参数参数描述…...

【C语言】循环语句(语句使用建议)

文章目录 **while循环****while循环的实践****补充:if语句与while语句区别****for循环(使用频率最高)****for循环的实践****while循环和for循环的对比****Do-while循环****break和continue语句****循环的嵌套****goto语句(不常用)****循环语句的效率(来自于高质量的C/C编程书籍…...

Spring Data访问Elasticsearch----响应式Reactive存储库

Spring Data访问Elasticsearch----响应式Reactive存储库 一、用法二、配置 Reactive Elasticsearch存储库支持建立在存储库中解释的核心存储库支持之上&#xff0c;利用由 Reactive REST客户端执行的 Reactive Elasticsearch Operations提供的操作。 Spring Data Elasticsear…...

堆排序(c语言)

文章目录 前言一.什么是堆二.向下调整算法三.堆排序的创建总结 前言 堆排序&#xff08;Heapsort&#xff09;是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构&#xff0c;并同时满足堆积的性质&#xff1a;即子结点的键值或索引总是小于&#x…...

开源IT自动化运维工具Ansible解析

Ansible 是一款开源的 IT 自动化工具&#xff0c;用于简化应用程序部署、配置管理、持续集成、基础设施即代码&#xff08;Infrastructure as Code, IaC&#xff09;和服务编排。它由 Michael DeHaan 创建&#xff0c;并在2012年首次发布&#xff0c;到2015年被红帽公司&#x…...

【C++】仿函数优先级队列反向迭代器

目录 一、优先级队列 1、priority_queue 的介绍 2、priority_queue 的使用 3、 priority_queue 的模拟实现 1&#xff09;priority_queue()/priority_queue(first, last) 2&#xff09;push&#xff08;x&#xff09; 3&#xff09;pop&#xff08;&#xff09; 4&#…...

UE4_调试工具_绘制调试球体

学习笔记&#xff0c;仅供参考&#xff01; 效果&#xff1a; 步骤&#xff1a; 睁开眼睛就是该变量在此蓝图的实例上可公开编辑。 勾选效果&#xff1a;...

机器人路径规划:基于冠豪猪优化算法(Crested Porcupine Optimizer,CPO)的机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…...

探索.NET中的定时器:选择最适合你的应用场景

概述&#xff1a;.NET提供多种定时器&#xff0c;如 System.Windows.Forms.Timer适用于UI&#xff0c;System.Web.UI.Timer用于Web&#xff0c;System.Diagnostics.Timer用于性能监控&#xff0c;System.Threading.Timer和System.Timers.Timer用于一般定时任务。在.NET 6及以上…...

5467: 【搜索】流浪奶牛

题目描述 吃不到饭的奶牛Bessie一气之下决定离开农场&#xff0c;前往阿尔费茨山脉脚底下的农场&#xff08;听说那儿的草极其美味&#xff09;投靠她的亲戚Jimmy。但是前往目的地的山路崎岖&#xff0c;Bessie又没有吃饭&#xff0c;她需要尽量保存体力&#xff0c;以最轻松的…...

spring boot整合elasticsearch实现查询功能

第一步、添加依赖&#xff08;注意版本对应关系&#xff09;根据spring boot版本选择合适的版本 <dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.6.2</version></dependenc…...

白嫖阿里云程序员日历

https://developer.aliyun.com/topic/lingma/activities/202403?taskCode14508&recordId44f3187f7950776f494eec668a62c65f#/?utm_contentm_fission_1 「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」 打开链接直接领就行了...

ubuntu20.04搭建rtmp视频服务

1.安装软件 sudo apt-get install ffmpeg sudo apt-get install nginx sudo apt-get install libnginx-mod-rtmp 2.nginx配置 修改/etc/nginx/nginx.conf文件&#xff0c;在末尾添加&#xff1a; rtmp {server {listen 1935;application live {live on;}} } 3.视频测试 本…...

Dev-C++双人小游戏避坑指南:地图设计、碰撞检测与蹦床逻辑详解

Dev-C双人小游戏避坑指南&#xff1a;地图设计、碰撞检测与蹦床逻辑详解 在控制台环境下开发双人跑酷游戏&#xff0c;看似简单却暗藏玄机。许多开发者第一次尝试时&#xff0c;往往会被地图管理、角色交互和特殊效果实现这三个环节卡住。本文将分享我在Dev-C环境下开发这类游戏…...

python如何对图片或文件的操作

一. base64 与图片的相互转换1. base64 转图片123456789101112131415161718192021import base64from io import BytesIOfrom PIL import Image# base64 编码的图像数据&#xff08;示例&#xff09;base64_data "iVBn9DHASKJDjDsdSADSf8lgg"# 将 base64 编码的字符串…...

Python测试代码如何实现自解释_使用pytest描述性命名规范

测试函数名须以test_开头并用下划线连接完整动宾短语&#xff0c;如test_calculate_total_returns_zero_for_empty_cart&#xff1b;参数化用pytest.mark.parametrize替代重复函数&#xff1b;断言需具体明确&#xff1b;fixture应以名词命名&#xff0c;体现被构建对象而非构建…...

AI手势识别极速CPU版:无需GPU,上传图片秒出彩虹骨骼图

AI手势识别极速CPU版&#xff1a;无需GPU&#xff0c;上传图片秒出彩虹骨骼图 1. 项目背景与核心价值 手势识别技术正在改变我们与数字世界的交互方式。从智能家居控制到虚拟现实操作&#xff0c;再到无障碍交互设计&#xff0c;这项技术展现出广阔的应用前景。然而&#xff…...

CSS Grid布局如何实现响应式排列_通过grid-template-columns适配不同屏幕

优先使用 fr 单位而非百分比&#xff0c;fr 按剩余空间分配、天然适配 Grid 弹性需求&#xff1b;响应式列数变化应依靠 repeat(auto-fit, minmax(min, 1fr)) 实现&#xff0c;无需多断点。grid-template-columns 用百分比还是 fr 单位&#xff1f;响应式 Grid 排列的核心不是“…...

Swift Protocols 怎么用?协议在 Swift 中如何定义和实现?

协议为方法、属性和其他要求功能提供了一个蓝图。它仅被描述为方法或属性的骨架&#xff0c;而不是实现。方法和属性的实现可以通过定义 class、function 和 enumeration 来进一步完成。协议的从属&#xff08;conformance&#xff09;被定义为满足协议要求的方法或属性。 在 …...

从CCF A类清单看计算机学科前沿:如何选择你的学术发表阵地

1. CCF A类清单&#xff1a;计算机学术圈的"米其林指南" 第一次看到CCF A类清单时&#xff0c;我正为博士开题选方向发愁。导师甩给我这份列表说&#xff1a;"这就是计算机学界的米其林三星榜单&#xff0c;发一篇能顶三篇普通论文。"后来我才理解&#x…...

【Python基础20讲】第17章:正则表达式

博主智算菩萨&#xff0c;专注于人工智能、Python编程、音视频处理及UI窗体程序设计等方向。致力于以通俗易懂的方式拆解前沿技术&#xff0c;从零基础入门到高阶实战&#xff0c;陪伴开发者共同成长。目前已开设五大技术专栏&#xff0c;累计发布多篇原创技术文章&#xff0c;…...

AGI实现路径全透视:3大主流技术路线(神经符号融合/具身智能/认知架构)的性能拐点与商业化时间表

第一章&#xff1a;AGI技术路线图&#xff1a;从当前AI到通用智能 2026奇点智能技术大会(https://ml-summit.org) 当前人工智能系统在特定任务上已展现出超越人类的表现&#xff0c;但其本质仍是窄域智能&#xff08;Narrow AI&#xff09;——依赖大量标注数据、固定分布假设…...

代码中的“魔法数字”,是敌人还是朋友?

代码中的“魔法数字”&#xff1a;是敌是友&#xff1f;在编程的世界里&#xff0c;"魔法数字"是一个充满争议的存在。它们指的是那些直接出现在代码中的未经解释的固定数值&#xff0c;比如if(status 3)中的"3"&#xff0c;或者array.length 1024中的&q…...