61 lines
2.2 KiB
Python
61 lines
2.2 KiB
Python
#!/usr/bin/env python3
|
|
"""Search РГБ (Russian State Library) via libgen.vg biblioservice. JSON, paginated.
|
|
Usage: rsl.py "query" [maxpages]
|
|
Polite: 3s between page requests."""
|
|
import sys, time, json, urllib.parse, urllib.request
|
|
|
|
UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
|
|
|
|
def fetch(url, tries=3):
|
|
last = None
|
|
for i in range(tries):
|
|
try:
|
|
req = urllib.request.Request(url, headers={"User-Agent": UA})
|
|
return urllib.request.urlopen(req, timeout=90).read().decode("utf-8", "replace")
|
|
except Exception as e:
|
|
last = e
|
|
time.sleep(5 + 5 * i)
|
|
raise SystemExit(f"fetch failed: {last}")
|
|
|
|
def main():
|
|
q = sys.argv[1]
|
|
maxpages = int(sys.argv[2]) if len(sys.argv) > 2 else 2
|
|
seen = set()
|
|
for page in range(1, maxpages + 1):
|
|
url = "https://libgen.vg/biblioservice.php?" + urllib.parse.urlencode(
|
|
{"value": q, "type": "rsl", "format": "json", "page": page})
|
|
try:
|
|
d = json.loads(fetch(url))
|
|
except SystemExit:
|
|
print("(fetch failed)")
|
|
break
|
|
recs = {k: v for k, v in d.items() if k != "error"}
|
|
if not recs:
|
|
if page == 1:
|
|
print("(no records)")
|
|
break
|
|
new = 0
|
|
for k in sorted(recs, key=int):
|
|
r = recs[k]
|
|
if r["id"] in seen:
|
|
continue
|
|
seen.add(r["id"])
|
|
new += 1
|
|
title = " ".join(r.get("title", [])) + (
|
|
(" : " + r["title_add"]) if r.get("title_add") else "")
|
|
author = "; ".join(r.get("author", []))
|
|
pub = " ".join(r.get("publisher", []))
|
|
city = " ".join(r.get("city", []))
|
|
year = " ".join(r.get("year", []))
|
|
pages = " ".join(r.get("pages", []))
|
|
isbn = ", ".join(r.get("505_isbn", []))
|
|
series = " ".join(r.get("series_name", []))
|
|
print(f"[{r['id']}] {title}")
|
|
print(f" {author}")
|
|
print(f" {city} : {pub}, {year} | {pages} | {isbn}" + (f" | серия: {series}" if series else ""))
|
|
if new == 0:
|
|
break
|
|
time.sleep(3)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|