arxiv について
arxivは、arXiv論文の検索、詳細情報の取得、PDFのダウンロードを行う研究スキルです。トピックや論文IDで検索でき、結果数や保存先の指定、既存の研究Wikiへの登録にも対応します。
主な機能
- 01トピックまたはarXiv IDで検索
- 02論文のメタデータと要旨を取得
- 03指定ディレクトリへのPDF保存
- 04既存ファイルのスキップと検証
- 05論文の研究Wikiへの取り込み
活用シーン
- 01研究テーマに関連する論文の検索
- 02指定したarXiv IDの論文詳細の取得
- 03検索結果のPDFをローカルに保存
- 04取得した論文を研究Wikiに追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ wanshuiyin/ auto-claude-code-research-in-sleep --skill arxivインストール後、Claude Code で/arxivを入力して読み込まれたか確認します。
詳細
arXiv 論文の検索とダウンロード
トピックまたは arXiv 論文 ID を検索:$ARGUMENTS
定数
- PAPER_DIR - ダウンロードした PDF を保存するローカルディレクトリ。デフォルト:現在のプロジェクトディレクトリ内の
papers/。 - MAX_RESULTS = 10 - 検索結果のデフォルト件数。
- ARXIV_FETCHER — 正式名称は
arxiv_fetch.pyで、shared-references/integration-contract.md§2(ポリシー D1 — 優先手段 + フォールバックのカスケード)に従って解決します。解決できない場合(正式な解決チェーンをすべて試した場合)は、ステップ 2 に記載されているインライン Python の代替手段を使用します。
引数に追加して指定するオーバーライド:
/arxiv "attention mechanism" - max: 20- 最大 20 件の結果を返します/arxiv "2301.07041" - download- ID で指定した論文をダウンロードします/arxiv "query" - dir: literature/- カスタムディレクトリに PDF を保存します/arxiv "query" - download: all- すべての検索結果の PDF をダウンロードします
ワークフロー
ステップ 1:引数を解析する
$ARGUMENTS を解析して、次の指示を確認します。
- クエリまたは ID:主な検索語、または
2301.07041やcs/0601001のような arXiv ID のみ - max: N:MAX_RESULTS を上書きします(例:- max: 20)- dir: PATH:PAPER_DIR を上書きします(例:- dir: literature/)- download:検索結果を表示した後、最初の結果の PDF をダウンロードします- download: all:すべての検索結果の PDF をダウンロードします
引数が arXiv ID のパターン(YYMM.NNNNN または category/NNNNNNN)に一致する場合は、検索をスキップしてステップ 3 に進みます。
ステップ 2:arXiv を検索する
正式な厳格セーフチェーンを使用して $ARXIV_FETCHER を解決します(shared-references/integration-contract.md §2 を参照)。
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
if [ -z "${ARIS_REPO:-}" ] && [ -f .aris/installed-skills.txt ]; then
ARIS_REPO=$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null) || true
fi
if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
fi
ARXIV_FETCHER=".aris/tools/arxiv_fetch.py"
[ -f "$ARXIV_FETCHER" ] || ARXIV_FETCHER="tools/arxiv_fetch.py"
[ -f "$ARXIV_FETCHER" ] || { [ -n "${ARIS_REPO:-}" ] && ARXIV_FETCHER="$ARIS_REPO/tools/arxiv_fetch.py"; }
[ -f "$ARXIV_FETCHER" ] || ARXIV_FETCHER=""
$ARXIV_FETCHER が空でない場合、次を実行します。
python3 "$ARXIV_FETCHER" search "QUERY" --max MAX_RESULTS
$ARXIV_FETCHER が空の場合(ポリシー D1 のカスケード)、インライン Python にフォールバックします。
python3 - <<'PYEOF'
import json
import urllib.parse
import urllib.request
import xml.etree.ElementTree as ET
NS = "http://www.w3.org/2005/Atom"
query = urllib.parse.quote("QUERY")
url = (f"http://export.arxiv.org/api/query"
f"?search_query={query}&start=0&max_results=MAX_RESULTS"
f"&sortBy=relevance&sortOrder=descending")
with urllib.request.urlopen(url, timeout=30) as r:
root = ET.fromstring(r.read())
papers = []
for entry in root.findall(f"{{{NS}}}entry"):
aid = entry.findtext(f"{{{NS}}}id", "").split("/abs/")[-1].split("v")[0]
title = (entry.findtext(f"{{{NS}}}title", "") or "").strip().replace("\n", " ")
abstract = (entry.findtext(f"{{{NS}}}summary", "") or "").strip().replace("\n", " ")
authors = [a.findtext(f"{{{NS}}}name", "") for a in entry.findall(f"{{{NS}}}author")]
published = entry.findtext(f"{{{NS}}}published", "")[:10]
cats = [c.get("term", "") for c in entry.findall(f"{{{NS}}}category")]
papers.append({
"id": aid,
"title": title,
"authors": authors,
"abstract": abstract,
"published": published,
"categories": cats,
"pdf_url": f"https://arxiv.org/pdf/{aid}.pdf",
"abs_url": f"https://arxiv.org/abs/{aid}",
})
print(json.dumps(papers, ensure_ascii=False, indent=2))
PYEOF
結果を次の表として表示します。
| # | arXiv ID | Title | Authors | Date | Category |
|---|------------|---------------------|----------------|------------|----------|
| 1 | 2301.07041 | Attention Is All... | Vaswani et al. | 2017-06-12 | cs.LG |
ステップ 3:特定の ID の詳細を取得する
単一の論文 ID が指定された場合(直接指定された場合、またはステップ 2 で取得した場合):
python3 "$ARXIV_FETCHER" search "id:ARXIV_ID" --max 1
# or fallback:
python3 -c "
import urllib.request, xml.etree.ElementTree as ET
NS = 'http://www.w3.org/2005/Atom'
url = 'http://export.arxiv.org/api/query?id_list=ARXIV_ID'
with urllib.request.urlopen(url, timeout=30) as r:
root = ET.fromstring(r.read())
# print full details ...
"
表示する情報:タイトル、全著者、カテゴリ、要旨全文、公開日、PDF URL、要旨 URL。
ステップ 4:PDF をダウンロードする
ダウンロードが要求された場合、ダウンロード対象の各論文 ID について:
# Using fetch script:
python3 "$ARXIV_FETCHER" download ARXIV_ID --dir PAPER_DIR
# Fallback:
mkdir -p PAPER_DIR && python3 -c "
import pathlib
import sys
import urllib.request
out = pathlib.Path('PAPER_DIR/ARXIV_ID.pdf')
if out.exists():
print(f'Already exists: {out}')
sys.exit(0)
req = urllib.request.Request(
'https://arxiv.org/pdf/ARXIV_ID.pdf',
headers={'User-Agent': 'arxiv-skill/1.0'},
)
with urllib.request.urlopen(req, timeout=60) as r:
out.write_bytes(r.read())
print(f'Downloaded: {out} ({out.stat().st_size // 1024} KB)')
"
各ダウンロードの後:
- ファイルサイズが 10 KB を超えていることを確認します(それより小さいファイルは拒否します。エラー HTML ページの可能性があります)。
- レート制限を避けるため、連続するダウンロードの間に 1 秒の待機時間を設けます。
- 次のように報告します:
Downloaded: papers/2301.07041.pdf (842 KB)
ステップ 5:要約する
各論文について(ダウンロードした論文、または API で取得した論文):
## [Title]
- **arXiv**: [ID] - [abs_url]
- **Authors**: [full author list]
- **Date**: [published]
- **Categories**: [cs.LG, cs.AI, ...]
- **Abstract**: [full abstract]
- **Key contributions** (extracted from abstract):
- [contribution 1]
- [contribution 2]
- [contribution 3]
- **Local PDF**: papers/[ID].pdf (if downloaded)
ステップ 6:リサーチ Wiki を更新する(有効な場合)
プロジェクトに research-wiki/ が存在する場合は必須です。それ以外の場合は、何も通知せずにスキップします。Wiki ディレクトリが存在する場合は、shared-references/wiki-helper-resolution.md の正式なチェーン(バリアント B — 警告してスキップ)に従って $WIKI_SCRIPT を解決し、この実行で取得したすべての論文を取り込みます。
if [ -d research-wiki/ ]; then
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
ARIS_REPO="${ARIS_REPO:-$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null)}"
if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
fi
WIKI_SCRIPT=".aris/tools/research_wiki.py"
[ -f "$WIKI_SCRIPT" ] || WIKI_SCRIPT="tools/research_wiki.py"
[ -f "$WIKI_SCRIPT" ] || { [ -n "${ARIS_REPO:-}" ] && WIKI_SCRIPT="$ARIS_REPO/tools/research_wiki.py"; }
[ -f "$WIKI_SCRIPT" ] || {
echo "WARN: research_wiki.py not found; arxiv results delivered, wiki ingest skipped. Fix: bash tools/install_aris.sh or smart_update.sh (refreshes ~/.aris/repo), export ARIS_REPO, or cp <ARIS-repo>/tools/research_wiki.py tools/." >&2
WIKI_SCRIPT=""
}
if [ -n "$WIKI_SCRIPT" ]; then
for each arxiv_id in results:
python3 "$WIKI_SCRIPT" ingest_paper research-wiki/ \
--arxiv-id "<arxiv_id>"
fi
fi
ヘルパーは、メタデータの取得、スラッグの生成、重複排除、ページの作成、インデックスの再構築、ログへの追記を 1 回の呼び出しで処理します。papers/<slug>.md を手作業で作成しないでください。正式なヘルパーのルールについては、shared-references/integration-contract.md を参照してください。取り込み漏れは、上記の手順で $WIKI_SCRIPT を解決した後、python3 "$WIKI_SCRIPT" sync research-wiki/ --arxiv-ids <id1>,<id2>,... を使って後から補完できます。
ステップ 7:最終出力
実行した内容を要約します。
Found N papers for "query"Downloaded: papers/2301.07041.pdf (842 KB)(ダウンロードごと)Wiki-ingested N papers(research-wiki/が存在した場合)- 警告(レート制限への到達、ファイルサイズが小さすぎる、すでに存在する場合)
次に使えるスキルを提案します。
/research-lit "topic" - multi-source review: Zotero + Obsidian + local PDFs + web
/novelty-check "idea" - verify your idea is novel against these papers
主なルール
- arXiv ID は常に目立つように表示します。引用と再現性のために必要です。
- ダウンロードした PDF を検証します。ファイルサイズが 10 KB 以下の場合は、警告を表示して削除します。
- レート制限:連続して PDF をダウンロードする場合は 1 秒間隔を空けます。HTTP 429 が発生した場合は、5 秒後に 1 回再試行します。
- 同じパスにある既存の PDF は上書きしません。スキップして「すでに存在します」と報告します。
- 新形式(
2301.07041)と旧形式(cs/0601001)の両方の arXiv ID に対応します。 PAPER_DIRは存在しない場合、自動的に作成されます。- arXiv API に接続できない場合は、エラーを明確に報告し、代替手段として
- sources: webを指定した/research-litの使用を提案します。