如何用Python抓取ResearcherID作者页AJAX生成的引用指标?
解决ResearcherID AJAX生成的Citation metrics抓取问题
看起来你用requests直接POST的方式没成功,大概率是因为请求的目标URL不对,或者缺少必要的请求头、Cookie、参数。下面给你两种可行的解决方案:
1. 用浏览器自动化工具(Selenium/Playwright)
这类工具会模拟真实浏览器的行为,自动等待AJAX内容加载完成,不需要手动分析复杂的API请求,适合处理动态渲染的页面。
Selenium示例代码:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器(这里用Chrome,需要提前安装对应版本的ChromeDriver) driver = webdriver.Chrome() # 打开目标作者页面 driver.get("http://www.researcherid.com/rid/A-7364-2016") # 等待Citation metrics区域加载完成(需要根据页面实际元素调整选择器) wait = WebDriverWait(driver, 15) # 假设Citation metrics的容器有特定的class或ID,替换成实际的定位方式即可 metrics_container = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, ".citation-metrics-container")) ) # 提取指标内容 print("Citation Metrics:\n", metrics_container.text) # 关闭浏览器 driver.quit()
Playwright示例代码(更现代的自动化工具):
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=False) # headless=False可以看到浏览器操作过程 page = browser.new_page() page.goto("http://www.researcherid.com/rid/A-7364-2016") # 等待指标区域加载完成 page.wait_for_selector(".citation-metrics-container") # 替换成实际页面的选择器 metrics_text = page.locator(".citation-metrics-container").text_content() print("Citation Metrics:\n", metrics_text) browser.close()
2. 分析真实API请求,用requests正确调用
如果不想用浏览器自动化,可以通过浏览器开发者工具找到加载Citation metrics的真实AJAX接口:
- 打开目标页面,按F12打开开发者工具
- 切换到Network标签,筛选XHR请求
- 点击页面上的Citation metrics窗口,找到对应的请求,复制它的URL、请求方法、Headers、参数和Cookie
然后用requests带上这些完整的信息发送请求,示例如下:
import requests # 创建会话,保持Cookie session = requests.Session() # 先访问一次作者页面,获取必要的Cookie和会话信息 session.get("http://www.researcherid.com/rid/A-7364-2016") # 从开发者工具复制的真实API接口URL api_url = "这里替换成你找到的AJAX接口URL" # 复制的请求参数(从Network面板的Form Data里复制) payload = { "rid": "A-7364-2016", # 其他必要参数,比如listid、key等,按实际复制的内容填写 } # 复制的请求头,至少要包含User-Agent和X-Requested-With 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", "X-Requested-With": "XMLHttpRequest", # 其他必要Headers,比如Referer、Cookie等,按实际复制的内容填写 } # 发送请求 response = session.post(api_url, data=payload, headers=headers) # 如果返回的是JSON格式,直接解析输出 print(response.json())
注意事项
- 网站可能有反爬机制,请求时不要过于频繁,最好添加适当的延迟(比如
time.sleep(2)) - Cookie可能会过期,如果请求失败,需要重新访问页面获取新的Cookie
- 元素选择器和API接口可能会随网站更新而变化,需要定期检查调整
内容的提问来源于stack exchange,提问作者ReturnedVoid




