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

Google Scholar用户作品链接爬取问题:无法获取‘show more’后内容

问题分析与解决方案

你遇到的核心问题是Google Scholar的“show more”内容是动态加载的——初始GET请求仅返回前20条成果的静态HTML,更多内容需要通过点击按钮触发AJAX POST请求获取。另外你的脚本存在几处语法错误,先修正基础问题,再解决动态加载的核心问题。

一、原脚本的语法错误修正

原脚本里的拼写和字符串闭合问题:

  • soup.final_all('table) → 改为 soup.find_all('table')(final_all是拼写错误,同时补全引号)
  • table.final_all('tr') → 改为 table.find_all('tr')

二、动态加载内容的爬取思路

Google Scholar加载更多成果时,会向https://scholar.google.com/citations发送POST请求,核心参数包括:

  • user:作者唯一ID(即你URL中的mG4imMEAAAAJ)
  • hl:语言标识(比如en)
  • cstart:起始条目索引(从20开始,每次递增加载数量)
  • pagesize:单次加载的成果数量(最大可设为100,减少请求次数)
  • view_op:固定值view_citation
  • sortby:排序规则(可选pubdate按发表日期、citation按引用量等)

同时需要注意:

  • 用Session保持会话,避免被判定为爬虫
  • 添加浏览器请求头模拟正常访问
  • 每次请求后添加延时,降低反爬触发概率

三、完整可用脚本

from bs4 import BeautifulSoup
import requests
import time

# 配置作者信息与请求参数
user_id = 'mG4imMEAAAAJ'
lang = 'en'
pagesize = 100  # 单次最多加载100条
session = requests.Session()
# 模拟浏览器请求头,可根据自己的浏览器修改
session.headers.update({
    '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'
})

all_links = []
cstart = 0  # 起始条目索引

while True:
    # 第一次请求用GET获取初始内容,后续用POST加载更多
    if cstart == 0:
        url = f'https://scholar.google.com/citations?hl={lang}&user={user_id}'
        response = session.get(url)
    else:
        url = 'https://scholar.google.com/citations'
        post_data = {
            'user': user_id,
            'hl': lang,
            'cstart': cstart,
            'pagesize': pagesize,
            'view_op': 'view_citation',
            'sortby': 'pubdate'  # 可替换为'citation'按引用量排序
        }
        response = session.post(url, data=post_data)
    
    soup = BeautifulSoup(response.text, 'lxml')
    
    # 定位成果表格,若无则终止循环
    tables = soup.find_all('table')
    if len(tables) < 2:
        break
    
    table = tables[1]
    rows = table.find_all('tr')
    
    # 提取当前页的成果链接
    current_links = []
    for row in rows:
        link_tag = row.find('a')
        if link_tag and 'href' in link_tag.attrs:
            link = link_tag['href']
            # 补全完整URL
            if not link.startswith('http'):
                link = f'https://scholar.google.com{link}'
            current_links.append(link)
    
    # 无新链接则终止循环
    if not current_links:
        break
    
    all_links.extend(current_links)
    cstart += pagesize
    time.sleep(2)  # 延时2秒,避免触发反爬

# 输出结果
print(f"共获取到 {len(all_links)} 条成果链接")
# 打印前5条验证
for idx, link in enumerate(all_links[:5], 1):
    print(f"{idx}. {link}")

注意事项

  • 若遇到403错误或验证码,说明触发了反爬机制,可延长延时时间(比如改为3-5秒),或更换User-Agent
  • Google Scholar的接口参数可能会不定期调整,若脚本失效,可通过浏览器开发者工具抓包查看最新请求参数
  • 请勿过度频繁请求,遵守网站的robots协议

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:25:30