在科研信息服务领域,大家经常需要批量获取论文元数据,比如 标题、作者、期刊、引用关系 等。如果只是人工下载,无论效率还是覆盖度都远远不够。因此,自动化采集就成了必备手段。
不过在实践中,你会发现同一个网站可能需要两种完全不同的处理方式:
本文以 Scopus 和 CNKI(中国知网) 为例,把这两类做法拆开讲清楚。
┌──────────────────────────┐
│ 学术数据库 (Scopus / CNKI) │
└───────────┬──────────────┘
│
┌─────────────────┴──────────────────┐
│ │
┌────▼─────┐ ┌─────▼─────┐
│ 路径 A │ │ 路径 B │
│ HTML解析 │ │ 模拟交互 │
└────┬─────┘ └─────┬─────┘
│ │
元数据提取 深层数据获取
下面用 Scopus 搜索“deep learning” 的结果做演示。
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)
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:交互
└─────┬─────┘
│
▼
数据存储
│
▼
科研分析 / 知识图谱
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。