Python爬取Google Scholar返回空JSON列表问题求助
解决Google Scholar数据提取返回空列表的问题
核心原因分析
返回空列表的直接原因是soup.select('.gs_r.gs_or.gs_scl')未匹配到任何结果,通常由以下两种情况导致:
- 触发反爬机制:请求被识别为非人类访问,返回的页面含人机验证而非搜索结果。
- 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
相关产品推荐
相关产品推荐

