直接用 requests + BeautifulSoup 抓不到真实引用量,因主流平台引用数据由 JS 动态加载、受反爬限制且需订阅;推荐用 Semantic Scholar 官方 API 获取 citationCount 并按其排序。

直接用 Python 抓取学术论文并按引用量排序,在绝大多数主流平台(如 Web of Science、Scopus、Nature、Science)上不可行。这些平台明确禁止自动化爬虫,且引用数据受版权限制、需订阅访问,返回的 HTML 通常带反爬逻辑(如动态渲染、token 验证、IP 限流),requests + BeautifulSoup 会立即失败或返回空页。
为什么 requests + BeautifulSoup 抓不到真实引用量?
Web of Science 和 Scopus 的论文详情页引用数是通过 JavaScript 动态加载的,服务器返回的初始 HTML 中不含该字段;Google Scholar 虽然结构较简单,但会主动封禁频繁请求的 IP,并返回验证码(403 Forbidden 或 503 Service Unavailable);即使绕过前端,其后端 API 也未公开,所有“引用量”字段均不包含在公开响应中。
- 尝试用
requests.get(url)获取 Google Scholar 论文页,response.text里找不到cited_by或类似字段 - Scopus 的详情页源码中只有占位符
<div class="citation-count"></div>,真实数据靠 JS 请求/citation-count?doi=xxx接口填充,而该接口要求带有效session-id和xsrf-token - Web of Science 的引用计数藏在 iframe 里,iframe src 是带签名参数的临时链接,过期时间通常 ≤60 秒
合法可用的替代方案:用 scholarly 库 + 显式限速
scholarly 是目前最稳定的 Google Scholar 封装库,它模拟浏览器行为、自动处理会话和部分反爬头,但必须人工干预启动流程,且不能高频调用。引用量字段名为 citedby,可直接提取。
- 安装:
pip install scholarly - 首次运行前需手动打开 Chrome,访问
https://scholar.google.com并完成验证(如点击“我同意”或拖动滑块),否则后续请求全被拦截 - 必须设置延迟:
scholarly.use_proxy_generator()不够,得加scholarly.set_retries(1)和time.sleep(2)每次查询后 - 搜索示例:
search_query = scholarly.search_pubs("attention is all you need"),遍历前 10 条用next(search_query),取pub['citedby']
更可靠的做法:优先用官方 API(如 Semantic Scholar)
Semantic Scholar 提供完全免费、无需登录、不限频次的 HTTP API,返回 JSON 中直接含 citationCount 字段,支持按该字段排序。它覆盖了约 2 亿篇论文,CS 和医学领域覆盖率高,但对人文类论文略弱。
立即学习“Python免费学习笔记(深入)”;
- 请求地址:
https://api.semanticscholar.org/graph/v1/paper/search?query=attention+is+all+you+need&limit=100&sort=citationCount:desc - 注意:
sort=citationCount:desc必须显式指定,否则默认按相关性排 - 返回结果中每篇论文的
citationCount是整数,非字符串,可直接用于排序 - 若需获取全文信息(如作者、摘要),需用返回的
paperId再发一次GET /graph/v1/paper/{paperId}
真正卡住的不是代码怎么写,而是数据来源的合法性边界——Semantic Scholar 的 citationCount 可信且易用,但 Web of Science 的“总被引频次”无法绕过订阅墙;哪怕你写出完美的 Selenium 脚本,只要触发平台风控策略,IP 就会被加入黑名单,后续所有请求都失效。


















