学术数据采集中的两条路径:结构化提取与交互式解析
在科研信息服务领域,大家经常需要批量获取论文元数据,比如 标题、作者、期刊、引用关系 等。如果只是人工下载,无论效率还是覆盖度都远远不够。因此,自动化采集就成了必备手段。
不过在实践中,你会发现同一个网站可能需要两种完全不同的处理方式:
* 有些页面一打开,结构化信息就已经在 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 解析方式:适合直接拿结果列表,速度快,开销小。
* 交互解析方式:适合深层数据(如引用网络、推荐文献),但性能代价更大。
* 混合策略 是实践中常见选择:先批量解析浅层内容,再有选择地调用交互模式,把核心数据补齐。