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_citationsortby:排序规则(可选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
相关产品推荐
相关产品推荐

