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

爬虫代理

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

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

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

* 有些页面一打开,结构化信息就已经在 HTML 里,可以直接解析。

* 另一些地方则依赖用户操作或脚本渲染,必须模拟交互才能拿到结果。

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

一、整体框架示意


二、模块拆解

1. 路径 A:直接解析 HTML

o 使用场景:Scopus 搜索结果页,文章标题和作者往往直接写在源码里。

o 特点:实现简单,抓取速度快。

o 局限:只能获取“浅层数据”,比如列表信息。

2. 路径 B:模拟交互获取

o 使用场景:CNKI 的引文网络、Scopus 的推荐文献。只有在点击或下拉时,前端才会发出异步请求。

o 特点:能拿到隐藏在交互之后的数据。

o 局限:性能消耗大,脚本更复杂。

3. 代理接入

o 学术站点的访问限制通常比较严格。通过配置 代理服务(如爬虫代理),可以降低被拦截的概率。

4. 数据存储

o 抓取结果一般会落地到 MongoDB/MySQL,供后续的数据分析或知识图谱构建使用。

三、示例代码

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

1. HTML 解析方式

import requests

from bs4 import BeautifulSoup

# ====== 代理配置(亿牛云示例 www.16yun.cn) ======

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

# ====== 代理配置(亿牛云示例 www.16yun.cn) ======

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()

四、流程概览

五、经验总结

* HTML 解析方式:适合直接拿结果列表,速度快,开销小。

* 交互解析方式:适合深层数据(如引用网络、推荐文献),但性能代价更大。

* 混合策略 是实践中常见选择:先批量解析浅层内容,再有选择地调用交互模式,把核心数据补齐。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容