You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动