Knihovny v Praze

Knihovny

Ahoj,

nějakou zvláštní náhodou jsem si dal ambiciózní úkol na tento rok - Navštívit, co nejvíce knihoven v Praze. Tohle je první příspěvek v sérii Library Review, kde postupně projdu, co nejvíce institucemi. Ideál je, že o každé napišu nějaký krátký text a postupně si tak projdeme celou Prahu.

Jak ale získat knihovny? Národní knihovna má databalíček (ADR - Centrální adresář knihoven a informačních institucí v ČR). Ten je přístupný v otevřených datech. To jsem samozřejmě nepoužil, ja si to poctivě nascrapoval pomocí tohodle kódu:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import asyncio
from playwright.async_api import async_playwright

async def main():
    with open("libraries.txt", "a", encoding="utf-8") as file:
        try:
            async with async_playwright() as pw:
                browser = await pw.chromium.launch(headless=False)
                context = await browser.new_context(
                    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
                )
                page = await context.new_page()

                for i in range(1, 1031):
                    print(f"Processing {i}")
                    set_entry = f"{i:06d}"

                    url = f"https://aleph.nkp.cz/F/2KUPKEFI2YJBY3KA4TLPB1H8QJQ5NQE59481CD8FUYPKM1SV7U-01633?func=full-set-set&set_number=189908&set_entry={set_entry}&format=999" # Tahle URL po nějaké době přestane fungovat (viz ten "token" mezi /F/ a ?), takže je potřeba ji znovu navštívit a zkopírovat. Když by to spadlo, tak kód appenduje, takže je možný prostě na změnit range v tom for i in range
                    await page.goto(url, timeout=120_000)
                    await page.wait_for_timeout(2000)

                    table_rows = await page.query_selector_all('//td[@class="td1"]')
                    closed = await table_rows[1].inner_text()
                    if "ZRUŠENA" in closed or "ZRUŠENÁ" in closed:
                        continue

                    name_tr = await page.query_selector('//tr[@id="Název instituce"]')
                    name = ""
                    if name_tr:
                        tds = await name_tr.query_selector_all("td")
                        if len(tds) > 1:
                            name = (await tds[1].inner_text()).strip()

                    address_tr = await page.query_selector('//tr[@id="Adresa"]')
                    address = ""
                    if address_tr:
                        tds = await address_tr.query_selector_all("td")
                        if len(tds) > 1:
                            address = (await tds[1].inner_text()).strip()

                    

                    print(f"{name}: {address}")
                    file.write(f"{name}: {address}\n")
                    file.flush()

                await browser.close()

        except Exception as e:
            print("Error:", e)

if __name__ == '__main__':
    asyncio.run(main())

To mi udělalo soubor, který jsem pomocí dalšího kódu změnil v následující mapku:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import folium
import re

def dms_to_decimal(d, m, s, direction):
    dec = float(d) + float(m) / 60 + float(s) / 3600
    if direction in ("S", "W"):
        dec = -dec
    return dec

pattern = re.compile(
    r'(\d+)°(\d+)’([\d.]+)"([NS]),\s*(\d+)°(\d+)’([\d.]+)"([EW])'
)

m = folium.Map(location=[50.08, 14.42], zoom_start=12)

marker_count = 0
current_name = None

with open("links.txt", encoding="utf-8") as f:
    for line in f:
        line = line.strip()
        if not line:
            continue

        if ":" in line and "GPS" not in line:
            current_name = line.split(":", 1)[0].strip()
            continue

        if "GPS" in line and current_name:
            match = pattern.search(line)
            if match:
                lat = dms_to_decimal(match.group(1), match.group(2), match.group(3), match.group(4))
                lon = dms_to_decimal(match.group(5), match.group(6), match.group(7), match.group(8))

                folium.Marker(
                    location=[lat, lon],
                    tooltip=current_name
                ).add_to(m)

                marker_count += 1
                current_name = None

print(marker_count)
m.save("map.html")

Používám k tomu folium, který jsem náhodou našel a od tý doby ho miluju. Vytváření map v pythonu nebylo nikdy jednodušší (než najdu ještě něco jednoduššího)

Viz mapka!!!

Teď už je postupně jen prochodit. Určitě některý budou zavřený (třeba archiv a knihovna Poštovního muzea, které je teď nově pod Technickým muzeem, tak je do skoro dubna zavřeno.)

(Jurnal entry za listopad až prosinec dodám, co nejdříve. V listopadu jsem skoro vůbec neprogramoval, v prosinci maličko. Tak nebylo moc o čem psát. Ale o tom později.)

An experiment
Built with Hugo
Theme Stack designed by Jimmy