Investigación en arXiv
Busca y recupera artículos académicos de arXiv a través de su API REST gratuita. Sin clave API, sin dependencias — solo curl.
Referencia rápida
| Acción | Comando |
|---|---|
| Buscar artículos | curl "https://export.arxiv.org/api/query?search_query=all:QUERY&max_results=5" |
| Obtener un artículo específico | curl "https://export.arxiv.org/api/query?id_list=2402.03300" |
| Leer resumen (web) | web_extract(urls=["https://arxiv.org/abs/2402.03300"]) |
| Leer artículo completo (PDF) | web_extract(urls=["https://arxiv.org/pdf/2402.03300"]) |
Búsqueda de artículos
La API devuelve Atom XML. Procesa con grep/sed o canaliza a través de python3 para una salida limpia.
Búsqueda básica
curl -s "https://export.arxiv.org/api/query?search_query=all:GRPO+reinforcement+learning&max_results=5"
Salida limpia (parsear XML a formato legible)
curl -s "https://export.arxiv.org/api/query?search_query=all:GRPO+reinforcement+learning&max_results=5&sortBy=submittedDate&sortOrder=descending" | python3 -c "
import sys, xml.etree.ElementTree as ET
ns = {'a': 'http://www.w3.org/2005/Atom'}
root = ET.parse(sys.stdin).getroot()
for i, entry in enumerate(root.findall('a:entry', ns)):
title = entry.find('a:title', ns).text.strip().replace('\n', ' ')
arxiv_id = entry.find('a:id', ns).text.strip().split('/abs/')[-1]
published = entry.find('a:published', ns).text[:10]
authors = ', '.join(a.find('a:name', ns).text for a in entry.findall('a:author', ns))
summary = entry.find('a:summary', ns).text.strip()[:200]
cats = ', '.join(c.get('term') for c in entry.findall('a:category', ns))
print(f'{i+1}. [{arxiv_id}] {title}')
print(f' Autores: {authors}')
print(f' Publicado: {published} | Categorías: {cats}')
print(f' Resumen: {summary}...')
print(f' PDF: https://arxiv.org/pdf/{arxiv_id}')
print()
"
Sintaxis de consulta
| Prefijo | Busca en | Ejemplo |
|---|---|---|
all: | Todos los campos | all:transformer+attention |
ti: | Título | ti:large+language+models |
au: | Autor | au:vaswani |
abs: | Resumen | abs:reinforcement+learning |
cat: | Categoría | cat:cs.AI |
co: | Comentario | co:accepted+NeurIPS |
Operadores booleanos
# Y (predeterminado al usar +)
search_query=all:transformer+attention
# O
search_query=all:GPT+OR+all:BERT
# Y NO
search_query=all:language+model+ANDNOT+all:vision
# Frase exacta
search_query=ti:"chain+of+thought"
# Combinado
search_query=au:hinton+AND+cat:cs.LG
Ordenación y paginación
| Parámetro | Opciones |
|---|---|
sortBy | relevance, lastUpdatedDate, submittedDate |
sortOrder | ascending, descending |
start | Desplazamiento de resultados (base 0) |
max_results | Número de resultados (predeterminado 10, máximo 30000) |
# Últimos 10 artículos en cs.AI
curl -s "https://export.arxiv.org/api/query?search_query=cat:cs.AI&sortBy=submittedDate&sortOrder=descending&max_results=10"
Obtención de artículos específicos
# Por ID de arXiv
curl -s "https://export.arxiv.org/api/query?id_list=2402.03300"
# Varios artículos
curl -s "https://export.arxiv.org/api/query?id_list=2402.03300,2401.12345,2403.00001"
Generación de BibTeX
Después de obtener los metadatos de un artículo, genera una entrada BibTeX:
{% raw %}
curl -s "https://export.arxiv.org/api/query?id_list=1706.03762" | python3 -c "
import sys, xml.etree.ElementTree as ET
ns = {'a': 'http://www.w3.org/2005/Atom', 'arxiv': 'http://arxiv.org/schemas/atom'}
root = ET.parse(sys.stdin).getroot()
entry = root.find('a:entry', ns)
if entry is None: sys.exit('Artículo no encontrado')
title = entry.find('a:title', ns).text.strip().replace('\n', ' ')
authors = ' and '.join(a.find('a:name', ns).text for a in entry.findall('a:author', ns))
year = entry.find('a:published', ns).text[:4]
raw_id = entry.find('a:id', ns).text.strip().split('/abs/')[-1]
cat = entry.find('arxiv:primary_category', ns)
primary = cat.get('term') if cat is not None else 'cs.LG'
last_name = entry.find('a:author', ns).find('a:name', ns).text.split()[-1]
print(f'@article{{{last_name}{year}_{raw_id.replace(\".\", \"\")},')
print(f' title = {{{title}}},')
print(f' author = {{{authors}}},')
print(f' year = {{{year}}},')
print(f' eprint = {{{raw_id}}},')
print(f' archivePrefix = {{arXiv}},')
print(f' primaryClass = {{{primary}}},')
print(f' url = {{https://arxiv.org/abs/{raw_id}}}')
print('}')
"
{% endraw %}
Lectura del contenido del artículo
Después de encontrar un artículo, léelo:
# Página de resumen (rápido, metadatos + resumen)
web_extract(urls=["https://arxiv.org/abs/2402.03300"])
# Artículo completo (PDF → markdown a través de Firecrawl)
web_extract(urls=["https://arxiv.org/pdf/2402.03300"])
Para procesamiento local de PDF, consulta la habilidad ocr-and-documents.
Categorías comunes
| Categoría | Campo |
|---|---|
cs.AI | Inteligencia Artificial |
cs.CL | Computación y Lenguaje (NLP) |
cs.CV | Visión por Computadora |
cs.LG | Aprendizaje Automático |
cs.CR | Criptografía y Seguridad |
stat.ML | Aprendizaje Automático (Estadística) |
math.OC | Optimización y Control |
physics.comp-ph | Física Computacional |
Lista completa: https://arxiv.org/category_taxonomy
Script auxiliar
El script scripts/search_arxiv.py maneja el parseo XML y proporciona una salida limpia:
python scripts/search_arxiv.py "GRPO reinforcement learning"
python scripts/search_arxiv.py "transformer attention" --max 10 --sort date
python scripts/search_arxiv.py --author "Yann LeCun" --max 5
python scripts/search_arxiv.py --category cs.AI --sort date
python scripts/search_arxiv.py --id 2402.03300
python scripts/search_arxiv.py --id 2402.03300,2401.12345
Sin dependencias: usa solo la biblioteca estándar de Python.
Semantic Scholar (Citas, Artículos Relacionados, Perfiles de Autor)
arXiv no proporciona datos de citas ni recomendaciones. Usa la API de Semantic Scholar para eso: gratuita, sin clave para uso básico (1 petición/segundo), devuelve JSON.
Obtener detalles del artículo + citas
# Por ID de arXiv
curl -s "https://api.semanticscholar.org/graph/v1/paper/arXiv:2402.03300?fields=title,authors,citationCount,referenceCount,influentialCitationCount,year,abstract" | python3 -m json.tool
# Por ID de artículo de Semantic Scholar o DOI
curl -s "https://api.semanticscholar.org/graph/v1/paper/DOI:10.1234/example?fields=title,citationCount"
Obtener citas DE un artículo (quiénes lo citaron)
curl -s "https://api.semanticscholar.org/graph/v1/paper/arXiv:2402.03300/citations?fields=title,authors,year,citationCount&limit=10" | python3 -m json.tool
Obtener referencias DE un artículo (a quién cita)
curl -s "https://api.semanticscholar.org/graph/v1/paper/arXiv:2402.03300/references?fields=title,authors,year,citationCount&limit=10" | python3 -m json.tool
Buscar artículos (alternativa a la búsqueda de arXiv, devuelve JSON)
curl -s "https://api.semanticscholar.org/graph/v1/paper/search?query=GRPO+reinforcement+learning&limit=5&fields=title,authors,year,citationCount,externalIds" | python3 -m json.tool
Obtener recomendaciones de artículos
curl -s -X POST "https://api.semanticscholar.org/recommendations/v1/papers/" \
-H "Content-Type: application/json" \
-d '{"positivePaperIds": ["arXiv:2402.03300"], "negativePaperIds": []}' | python3 -m json.tool
Perfil de autor
curl -s "https://api.semanticscholar.org/graph/v1/author/search?query=Yann+LeCun&fields=name,hIndex,citationCount,paperCount" | python3 -m json.tool
Campos útiles de Semantic Scholar
title, authors, year, abstract, citationCount, referenceCount, influentialCitationCount, isOpenAccess, openAccessPdf, fieldsOfStudy, publicationVenue, externalIds (contiene ID de arXiv, DOI, etc.)
Flujo de trabajo completo de investigación
- Descubrir:
python scripts/search_arxiv.py "tu tema" --sort date --max 10 - Evaluar impacto:
curl -s "https://api.semanticscholar.org/graph/v1/paper/arXiv:ID?fields=citationCount,influentialCitationCount" - Leer resumen:
web_extract(urls=["https://arxiv.org/abs/ID"]) - Leer artículo completo:
web_extract(urls=["https://arxiv.org/pdf/ID"]) - Encontrar trabajos relacionados:
curl -s "https://api.semanticscholar.org/graph/v1/paper/arXiv:ID/references?fields=title,citationCount&limit=20" - Obtener recomendaciones: POST al endpoint de recomendaciones de Semantic Scholar
- Seguir autores:
curl -s "https://api.semanticscholar.org/graph/v1/author/search?query=NOMBRE"
Límites de frecuencia
| API | Límite | Autenticación |
|---|---|---|
| arXiv | ~1 petición / 3 segundos | Ninguna necesaria |
| Semantic Scholar | 1 petición / segundo | Ninguna (100/s con clave API) |
Notas
- arXiv devuelve Atom XML — usa el script auxiliar o el fragmento de parseo para una salida limpia
- Semantic Scholar devuelve JSON — canaliza a través de
python3 -m json.toolpara legibilidad - IDs de arXiv: formato antiguo (
hep-th/0601001) vs nuevo (2402.03300) - PDF:
https://arxiv.org/pdf/{id}— Resumen:https://arxiv.org/abs/{id} - HTML (cuando esté disponible):
https://arxiv.org/html/{id} - Para procesamiento local de PDF, consulta la habilidad
ocr-and-documents
Versionado de IDs
arxiv.org/abs/1706.03762siempre resuelve a la última versiónarxiv.org/abs/1706.03762v1apunta a una versión específica inmutable- Al generar citas, conserva el sufijo de versión que realmente leíste para evitar desviación de la cita (una versión posterior puede cambiar sustancialmente el contenido)
- El campo
<id>de la API devuelve la URL versionada (ej.,http://arxiv.org/abs/1706.03762v7)
Artículos retirados
Los artículos pueden ser retirados después del envío. Cuando esto sucede:
- El campo
<summary>contiene un aviso de retiro (busca "retirado" o "retractado") - Los campos de metadatos pueden estar incompletos
- Siempre verifica el resumen antes de tratar un resultado como un artículo válido