学术数据采集中的两条路径:结构化提取与交互式解析

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 在科研信息采集过程中,自动化获取论文元数据(如标题、作者、引用等)已成为刚需。本文以 Scopus 和 CNKI 为例,详解两种主流抓取方式:一是直接解析 HTML 获取浅层数据,二是通过模拟交互提取深层内容,并结合代理服务绕过访问限制,实现高效稳定的数据采集。

爬虫代理

在科研信息服务领域,大家经常需要批量获取论文元数据,比如 标题、作者、期刊、引用关系 等。如果只是人工下载,无论效率还是覆盖度都远远不够。因此,自动化采集就成了必备手段。

不过在实践中,你会发现同一个网站可能需要两种完全不同的处理方式:

  • 有些页面一打开,结构化信息就已经在 HTML 里,可以直接解析。
  • 另一些地方则依赖用户操作或脚本渲染,必须模拟交互才能拿到结果。

本文以 ScopusCNKI(中国知网) 为例,把这两类做法拆开讲清楚。

一、整体框架示意

            ┌──────────────────────────┐
            │   学术数据库 (Scopus / CNKI) │
            └───────────┬──────────────┘
                        │
      ┌─────────────────┴──────────────────┐
      │                                    │
 ┌────▼─────┐                        ┌─────▼─────┐
 │ 路径 A    │                        │ 路径 B    │
 │ HTML解析   │                        │ 模拟交互   │
 └────┬─────┘                        └─────┬─────┘
      │                                    │
   元数据提取                           深层数据获取

二、模块拆解

  1. 路径 A:直接解析 HTML
    • 使用场景:Scopus 搜索结果页,文章标题和作者往往直接写在源码里。
    • 特点:实现简单,抓取速度快。
    • 局限:只能获取“浅层数据”,比如列表信息。
  2. 路径 B:模拟交互获取
    • 使用场景:CNKI 的引文网络、Scopus 的推荐文献。只有在点击或下拉时,前端才会发出异步请求。
    • 特点:能拿到隐藏在交互之后的数据。
    • 局限:性能消耗大,脚本更复杂。
  3. 代理接入
    • 学术站点的访问限制通常比较严格。通过配置 代理服务(如爬虫代理),可以降低被拦截的概率。
  4. 数据存储
    • 抓取结果一般会落地到 MongoDB/MySQL,供后续的数据分析或知识图谱构建使用。

三、示例代码

下面用 Scopus 搜索“deep learning” 的结果做演示。

1. HTML 解析方式

import requests
from bs4 import BeautifulSoup

# ====== 代理配置(亿牛云示例) ======
proxy_host = "proxy.16yun.cn"
proxy_port = "3100"
proxy_user = "16YUN"
proxy_pass = "16IP"

proxies = {
   
    "http": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
    "https": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}"
}

# ====== 抓取 Scopus 列表页 ======
url = "https://www.scopus.com/results?src=srctitle&q=deep+learning"
headers = {
   "User-Agent": "Mozilla/5.0"}

resp = requests.get(url, headers=headers, proxies=proxies, timeout=10)
soup = BeautifulSoup(resp.text, "html.parser")

papers = []
for item in soup.select(".result-item-content"):
    title = item.select_one("h2").text.strip()
    author = item.select_one(".author").text.strip() if item.select_one(".author") else "未知"
    papers.append({
   "title": title, "author": author})

print(papers)

2. 模拟交互方式

from playwright.sync_api import sync_playwright

# ====== 代理配置(亿牛云示例) ======
proxy_host = "proxy.16yun.cn"
proxy_port = "3100"
proxy_user = "16YUN"
proxy_pass = "16IP"

with sync_playwright() as p:
    browser = p.chromium.launch(
        headless=True,
        proxy={
   
            "server": f"http://{proxy_host}:{proxy_port}",
            "username": proxy_user,
            "password": proxy_pass
        }
    )
    page = browser.new_page()

    page.goto("https://www.scopus.com/results?src=srctitle&q=deep+learning")
    page.wait_for_timeout(5000)

    # 点击展开更多引用信息
    if page.is_visible("text=View all related documents"):
        page.click("text=View all related documents")
        page.wait_for_timeout(3000)

    items = page.query_selector_all(".result-item-content")
    papers = []
    for item in items:
        title = item.query_selector("h2").inner_text()
        author = item.query_selector(".author").inner_text() if item.query_selector(".author") else "未知"
        papers.append({
   "title": title, "author": author})

    print(papers)
    browser.close()

四、流程概览

采集任务启动
       │
       ▼
   [代理模块]
       │
 ┌─────┴─────┐
 │ 路径 A:HTML │ 路径 B:交互
 └─────┬─────┘
       │
       ▼
   数据存储
       │
       ▼
科研分析 / 知识图谱

五、经验总结

  • HTML 解析方式:适合直接拿结果列表,速度快,开销小。
  • 交互解析方式:适合深层数据(如引用网络、推荐文献),但性能代价更大。
  • 混合策略 是实践中常见选择:先批量解析浅层内容,再有选择地调用交互模式,把核心数据补齐。
相关文章
|
自然语言处理 算法
向量检索服务的优缺点
使用向量检索服务的好处是它可以将文本信息转化为向量表示,并进行相似度计算。这使得能够高效地搜索与查询进行语义匹配的文本
1145 3
|
安全 Ubuntu 关系型数据库
Ubuntu下MySQL无法启动和访问的问题解决与修复
Ubuntu下MySQL无法启动和访问的问题解决与修复
1810 1
Ubuntu下MySQL无法启动和访问的问题解决与修复
|
2月前
|
编解码 人工智能 小程序
魔搭社区模型速递(8.17-8.23)
🙋魔搭ModelScope本期社区进展:📟1652个模型,📁216个数据集,🎨54个创新应用,📄 4篇内容
389 8
魔搭社区模型速递(8.17-8.23)
|
2月前
|
Java 数据库 C++
Java异常处理机制:try-catch、throws与自定义异常
本文深入解析Java异常处理机制,涵盖异常分类、try-catch-finally使用、throw与throws区别、自定义异常及最佳实践,助你写出更健壮、清晰的代码,提升Java编程能力。
|
2月前
|
运维 监控 测试技术
2025年微服务架构关键知识点(一):核心原则与演进趋势
微服务架构凭借其高可用性、灵活扩展等优势,已成为2025年主流软件开发范式。本文深入解析微服务的核心原则、演进趋势及实践要点,助力开发者夯实基础,应对挑战,构建高效、稳定的系统架构。
|
11月前
|
存储 人工智能 缓存
官宣开源 阿里云与清华大学共建AI大模型推理项目Mooncake
近日,清华大学和研究组织9#AISoft,联合以阿里云为代表的多家企业和研究机构,正式开源大模型资源池化项目 Mooncake。
|
4月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
451 4
|
8月前
|
数据采集 存储 机器学习/深度学习
探索Python的力量:如何处理大数据
探索Python的力量:如何处理大数据
159 7
|
12月前
|
机器学习/深度学习 自然语言处理 数据处理
深度学习之语音情感识别与响应
基于深度学习的语音情感识别(Speech Emotion Recognition,SER)与响应系统在语音交互、客服、心理健康等领域有着重要应用。该系统的目标是识别出说话者的情感状态(如愤怒、喜悦、悲伤等)并生成合适的情感响应,从而提升用户体验和交互效果。
746 2
|
前端开发 JavaScript
用iframe的方式实现微前端
微前端是最近几年火起来的概念,iframe是早期实现微前端的理想方案,而现在有了其它的方案,比如qianduan框架,single-spa,以及webpack5带来的联邦模块方案。但是每一个方案都有其优缺点,感兴趣的可以去实践一下。