58 lines
1.9 KiB
Python
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.")
|