You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬取Google Scholar返回空JSON列表问题求助

解决Google Scholar数据提取返回空列表的问题

核心原因分析

返回空列表的直接原因是soup.select('.gs_r.gs_or.gs_scl')未匹配到任何结果,通常由以下两种情况导致:

  1. 触发反爬机制:请求被识别为非人类访问,返回的页面含人机验证而非搜索结果。
  2. CSS选择器失效:Google Scholar更新了页面结构,原选择器对应的元素类名或层级已改变。

具体修复步骤

1. 检查是否触发人机验证

发送请求后先打印响应文本前部分内容,判断是否含验证关键词:

response = requests.get('https://scholar.google.com/scholar', headers=headers, params=params)
print(response.text[:500])  # 打印前500字符

若输出出现captcha、verify或验证界面HTML,需:

  • 更换最新版浏览器的User-Agent
  • 使用requests.Session()保持会话,模拟真实浏览器连接
  • 添加Accept、Accept-Language、Referer等请求头字段
  • 降低请求频率或使用代理IP

2. 修正CSS选择器

Google Scholar页面结构常更新,原选择器已失效,调整后的可靠逻辑:

  • 结果容器:将.gs_r.gs_or.gs_scl改为.gs_r.gs_or(当前通用结果容器类名)
  • 链接提取:不再依赖固定位置选择器,改为在每个结果容器内遍历链接,通过文本内容匹配目标

3. 修改后的完整代码

import requests
from bs4 import BeautifulSoup
import json

# 使用Session维持会话,提升请求真实性
session = requests.Session()
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'Referer': 'https://scholar.google.com/',
    'DNT': '1'
}

params = {
    'q': 'Machine learning',
    'hl': 'en'
}

response = session.get('https://scholar.google.com/scholar', headers=headers, params=params)

# 检测人机验证
if "captcha" in response.text.lower() or "verify" in response.text.lower():
    print("触发人机验证,请更换IP/代理或调整请求头后重试")
else:
    soup = BeautifulSoup(response.text, 'lxml')
    data = []

    # 遍历所有结果容器
    for result in soup.select('.gs_r.gs_or'):
        # 提取标题及链接
        title_elem = result.select_one('.gs_rt')
        title = title_elem.text.strip() if title_elem else "无标题"
        title_link = title_elem.select_one('a')['href'] if title_elem.select_one('a') else None

        # 提取出版信息
        publication_info = result.select_one('.gs_a').text.strip() if result.select_one('.gs_a') else "无出版信息"

        # 提取摘要片段
        snippet = result.select_one('.gs_rs').text.strip() if result.select_one('.gs_rs') else "无摘要"

        # 提取引用链接
        cited_by = None
        for link in result.select('.gs_fl a'):
            if "Cited by" in link.text:
                cited_by = f'https://scholar.google.com{link["href"]}'
                break

        # 提取相关文章链接
        related_articles = None
        for link in result.select('.gs_fl a'):
            if "Related articles" in link.text:
                related_articles = f'https://scholar.google.com{link["href"]}'
                break

        # 提取所有版本链接
        all_versions = None
        for link in result.select('.gs_fl a'):
            if "All versions" in link.text:
                all_versions = f'https://scholar.google.com{link["href"]}'
                break

        # 提取PDF链接
        pdf_link = result.select_one('.gs_or_ggsm a')['href'] if result.select_one('.gs_or_ggsm a') else None

        data.append({
            'title': title,
            'title_link': title_link,
            'publication_info': publication_info,
            'snippet': snippet,
            'cited_by': cited_by,
            'related_articles': related_articles,
            'all_article_versions': all_versions,
            'pdf_link': pdf_link
        })

    print(json.dumps(data, indent=2, ensure_ascii=False))

额外注意事项

  • Google Scholar反爬机制严格,频繁请求仍可能触发验证,建议控制请求频率
  • 长期提取数据可考虑申请Google Scholar官方学术API,避免违规爬取

内容的提问来源于stack exchange,提问作者Saad Hamim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:01:15