#!/usr/bin/env python3 import urllib.request import urllib.parse import json import os out_dir = "/home/admin/GBS_Research/学术论文" os.makedirs(out_dir, exist_ok=True) def extract_abstract(w): abstract_inv = w.get("abstract_inverted_index", {}) if not abstract_inv: return "" pairs = [] for word, positions in abstract_inv.items(): for pos in positions: pairs.append((pos, word)) pairs.sort() return " ".join(pw for _, pw in pairs) def search_openalex(query, per_page=15): url = f"https://api.openalex.org/works?search={urllib.parse.quote(query)}&per_page={per_page}&sort=cited_by_count:desc" req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0", "Accept": "application/json"}) with urllib.request.urlopen(req, timeout=30) as resp: data = json.loads(resp.read().decode()) results = [] for w in data.get("results", []): results.append({ "title": w.get("title", ""), "doi": w.get("doi", ""), "year": w.get("publication_year", ""), "cited_by_count": w.get("cited_by_count", 0), "authors": [a.get("author",{}).get("display_name","") for a in w.get("authorships",[])], "source": w.get("primary_location",{}).get("source",{}).get("display_name","") if w.get("primary_location") else "", "abstract": extract_abstract(w), "language": w.get("language",""), "query": query, }) return results, data.get("meta",{}).get("count", 0) # English queries en_queries = [ "shared services value creation", "shared service center multinational", "global business services GBS", "financial shared services China", "shared services digital transformation", "shared services compliance cross-border", "shared services cost efficiency", "business process reengineering shared services", ] # Chinese queries cn_queries = [ "共享服务中心 价值创造", "全球商业服务 跨国企业", "财务共享 跨境 合规", "GBS 能力中心 中国", "共享服务中心 数字化转型", "共享服务中心 成本效率", ] all_papers = {} print("=" * 60) print("搜索英文文献 (OpenAlex)") print("=" * 60) for q in en_queries: try: results, total = search_openalex(q) added = 0 for p in results: key = p["doi"] or p["title"] if key and key not in all_papers: all_papers[key] = p added += 1 print(f"✓ EN '{q}': {total} total, {added} new") except Exception as e: print(f"✗ EN '{q}': {e}") print(f"\n英文文献去重后: {len(all_papers)} 篇") print("\n" + "=" * 60) print("搜索中文文献 (OpenAlex)") print("=" * 60) for q in cn_queries: try: results, total = search_openalex(q) added = 0 for p in results: key = p["doi"] or p["title"] if key and key not in all_papers: all_papers[key] = p added += 1 print(f"✓ CN '{q}': {total} total, {added} new") except Exception as e: print(f"✗ CN '{q}': {e}") print(f"\n总去重论文数: {len(all_papers)}") papers = sorted(all_papers.values(), key=lambda x: x.get("cited_by_count",0), reverse=True) # Save JSON with open(f"{out_dir}/openalex_all_papers.json", "w", encoding="utf-8") as f: json.dump(papers, f, ensure_ascii=False, indent=2) # Save English summary en_papers = [p for p in papers if p.get("language","") == "en" or not p.get("language")] cn_paper_list = [p for p in papers if p.get("language","") == "zh" or p.get("language","") == "zh-Hant"] # Full markdown lines = ["# GBS/共享服务中心 学术论文汇总\n"] lines.append(f"**搜索日期**: 2026-06-27\n") lines.append(f"**数据来源**: OpenAlex API\n") lines.append(f"**总论文数**: {len(papers)} (英文: {len(en_papers)}, 中文: {len(cn_paper_list)})\n") lines.append("\n## 按被引次数排序的论文列表\n") lines.append("| # | 标题 | 年份 | 被引 | 语言 | 期刊 |") lines.append("|---|------|------|------|------|------|") for i, p in enumerate(papers, 1): title = p["title"][:90] if p["title"] else "N/A" lines.append(f"| {i} | {title} | {p['year']} | {p['cited_by_count']} | {p['language']} | {p['source'][:40]} |") lines.append("\n---\n## 详细论文信息与摘要\n") for i, p in enumerate(papers, 1): lines.append(f"### {i}. {p['title']}") lines.append(f"- **年份**: {p['year']} | **被引次数**: {p['cited_by_count']} | **语言**: {p['language']}") lines.append(f"- **期刊/来源**: {p['source']}") lines.append(f"- **作者**: {', '.join(p['authors'][:6])}") if p['doi']: lines.append(f"- **DOI**: [{p['doi']}]({p['doi']})") lines.append(f"- **搜索关键词**: {p['query']}") if p['abstract']: lines.append(f"- **摘要**: {p['abstract'][:600]}") else: lines.append(f"- **摘要**: 无") lines.append("") with open(f"{out_dir}/学术论文汇总.md", "w", encoding="utf-8") as f: f.write("\n".join(lines)) # Top cited dedicated file lines2 = ["# 高被引论文TOP30\n\n"] for i, p in enumerate(papers[:30], 1): lines2.append(f"## {i}. {p['title']}\n") lines2.append(f"- **被引**: {p['cited_by_count']} | **年份**: {p['year']} | **语言**: {p['language']}") lines2.append(f"- **期刊**: {p['source']}") lines2.append(f"- **作者**: {', '.join(p['authors'][:5])}") lines2.append(f"- **DOI**: {p['doi']}") lines2.append(f"- **摘要**: {p['abstract'][:800]}\n") with open(f"{out_dir}/高被引论文TOP30.md", "w", encoding="utf-8") as f: f.write("\n".join(lines2)) print(f"\n文件已保存到 {out_dir}/") print(f" - openalex_all_papers.json ({len(papers)} papers)") print(f" - 学术论文汇总.md") print(f" - 高被引论文TOP30.md") print(f"\nTop 5 by citations:") for p in papers[:5]: print(f" [{p['cited_by_count']}] {p['title'][:70]}")