rmi-backend/scripts/find_paper_ids.py

58 lines
1.9 KiB
Python

#!/usr/bin/env python3
"""Search arxiv for papers with retry logic."""
import json
import sys
import time
import urllib.request
import xml.etree.ElementTree as ET
def search_arxiv(query, max_results=5):
"""Search arxiv and return list of (arxiv_id, title) tuples."""
q = "+AND+".join([f"ti:{w}" for w in query.split()[:4]])
url = f"https://export.arxiv.org/api/query?search_query={q}&max_results={max_results}"
try:
req = urllib.request.Request(url, headers={"User-Agent": "RMI-Research-Bot/1.0"})
resp = urllib.request.urlopen(req, timeout=30)
data = resp.read()
root = ET.fromstring(data)
ns = {"a": "http://www.w3.org/2005/Atom"}
results = []
for entry in root.findall("a:entry", ns):
title = entry.find("a:title", ns).text.strip().replace("\n", " ")
aid = entry.find("a:id", ns).text.strip()
aid = aid.split("/abs/")[-1]
results.append((aid, title))
return results
except Exception as e:
print(f"ERROR: {e}", file=sys.stderr)
return []
# Search for each paper
searches = {
"smart_contract_vuln": "smart contract vulnerability detection graph feature",
"temporal_amount": "temporal amount snapshot multigraph ethereum",
"reentrancy": "reentrancy vulnerability identification ethereum smart contract",
"tokenomics_design": "tokenomics design token economy",
"token_vesting": "token vesting cryptocurrency",
"governance_tokens": "governance token distribution empirical",
}
results = {}
for key, q in searches.items():
print(f"Searching: {q}", flush=True)
r = search_arxiv(q)
results[key] = r
if r:
for aid, title in r:
print(f" {aid} | {title[:100]}")
else:
print(" NO RESULTS")
time.sleep(5) # Rate limit
# Save results
with open("/root/backend/data/papers/search_results.json", "w") as f:
json.dump(results, f, indent=2)
print("\nDone. Results saved.")