| |
| """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 [] |
|
|
|
|
| |
| 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) |
|
|
| |
| with open("/root/backend/data/papers/search_results.json", "w") as f: |
| json.dump(results, f, indent=2) |
| print("\nDone. Results saved.") |
|
|