Če bomo v projektu uporabljali pakete, ki niso del standardne Pythonove knjižnice, je treba pakete namestiti. Najpogostejši način za upravljanje s paketi je z uporabo virtualnih okolij in nameščevalnika paketov pip, ki bosta na kratko opisana v naslednjih razdelkih.
Pripravimo virtualno razvojno okolje (angl. virtual environment) venv
, ki omogoča boljšo kontrolo nad nameščenimi paketi, ki so specifični za posamezne projekte.
Odpremo ukazno lupino v korenskem imeniku projekta (angl. project root). Ustvarimo virtualno okolje z ukazom:
python3 -m venv <ime_okolja>
kjer <ime_okolja>
zamenjamo z želenim imenom okolja. Ponavadi se uporablja kar venv
, a ni zares pomembno. Ko smo ustvarili okolje, ga aktiviramo.
Windows:
.\<ime_okolja>\Scripts\activate
Linux/MacOS:
source <ime_okolja>/bin/activate
Če smo ukaze uspešno izvedli, se bo pred pozivom (angl. prompt) v ukazni lupini prikazalo ime virtualnega okolja:
(venv) C:\Users\Uporabnik\Documents\podatkovne-baze1>
V aktivirano okolje lahko sedaj namestimo pakete, ki jih želimo namestiti.
Če želimo kodo zaganjati s pomočjo VS Code (in ne direktno iz ukazne lupine), moramo urejevalniku VS Code povedati, kateri interpreter naj uporabi ob zagonu. Z bližnjico Ctrl + Shift + P
odpremo okno za ukaze. Poiščemo možnost Python: Select Interpreter
:
Če smo virtualno okolje namestili v korenski imenik projekta, bo VS Code verjetno že sam predlagal, kateri interpreter lahko izberemo (v tem primeru je to ta z imenom venv, ki se nahaja v projektu):
V nasprotnem primeru bo treba interpreter poiskati na roke (to bo odvisno od posameznega sistema).
Pakete namestimo z uporabo nameščvalnika pip
(ta lepo sodeluje z virtualnimi okolji venv).
pip install <ime_paketa1> <ime_paketa2> <ime_paketa3> ...
Če smo se odločili, da ne bomo uporabljali virtualnih okolij, bo morda potrebno povedati, katero verzijo Pythona želimo uporabiti (na sistemu je lahko hkrati nameščenih več verzij Pythona) - ponavadi bo imela ime python3
, če je več verzij bo lahko ime tudi oblike npr. python3.10
:
python3 -m pip install <ime_paketa1> <ime_paketa2> <ime_paketa3> ...
Nekaj nasvetov, kako pripraviti repozitorij.
V repozitorij ponavadi vključimo datoteko Readme.md
, v kateri na kratko opišemo projekt in navodila za vzpostavitev projekta (kaj mora uporabnik storiti, da projekt vzpostavi na svojem računalniku). Vključimo lahko tudi slike (npr. ER diagram baze), primere uporabe, ...
Če projekt zahteva pakete, ki niso del standardne knjižnice v jeziku Python, jih navedemo za lažjo vzpostavitev projekta. Lahko jih zapišemo tudi v besedilno datoteko (npr. requirements.txt), ki jo nato uporabnik lahko zažene z ukazom pip install -r requirements.txt
in s tem enostavno namesti vse zahtevane pakete. To je sploh uporabno, kadar gre za večji projekt z večjim številom paketov.
Primer:
bottle
beautifulsoup4
requests
V gitu ponavadi ne vključujemo:
- datotek in imenikov, ki zasedejo veliko prostora (npr. podatkovna baza) in niso nujni za delovanje projekta (jih lahko poustvarimo programsko)
- datotek, ki so vezani na določen računalnik (npr. virtualno okolje, .vscode, ...)
- datotek, ki vsebujejo občutljive podatke (npr. gesla, osebni podatki)
V ta namen v repozitoriju ustvarimo datoteko z imenom .gitignore
. Najlažje je, če datoteko ustvarimo kar na GitHubu, ki že vsebuje predloge za izbrane programske jezike. Lahko pa datoteko ustvarimo tudi ročno. V datoteki navedemo imena ali poti do datotek in imenikov (oziroma vzorce), ki jih želimo izključeti iz beleženja verzij. Datoteka z vsebino
.vscode
venv
*.jpg
podatki/*.sqlite
nastavitve/skrivnost.txt
iz verzioniranja izključi:
- podimenik
.vscode
, ki vsebuje nastavitve urejevalnika kode VS code - podimenik
venv
, ki vsebuje virtualno okolje - vse datoteke (slike) s končnico
.jpg
- datoteke s končnico
sqlite
, ki se nahajajo v podimenikupodatki
- datoteko
skrivnost.txt
v podimenikunastavitve
Če želimo podatke pridobiti s spleta, lahko prenesemo html kodo z uporabo knjižnice requests
:
Z requests.get nato pošljemo zahtevo za prenos HTML kode spletne strani:
import requests
odgovor = requests.get("https://www.legendww.me/zenska-odjeca")
V tem primeru je odgovor
objekt tipa Response
, ki vsebuje lastnosti content
in status_code
. odgovor.status_code
nam pove, kako se je strežnik odzval na naš zahtevek - če je koda enaka 200
, smo s strani uspešno pridobili odgovor in bo v odgovor.content
shranjena HTML koda spletne strani. Kode, oblike 4xx
(napaka na strani uporabnika) in 5xx
(napaka na strani strežnika) pomenijo, da je bilo pridobivanje neuspešno. Nekaj pogostih neuspešnih odzivov:
- 400 (Bad request) - Napačno strukturirana poizvedba
- 401 (Unauthorized) - Stran zahteva prijavo za ogled vsebine
- 403 (Forbidden) - Nimamo pravic za ogled vsebine
- 404 (Not found) - Stran, ki jo iščemo, ne obstaja (morda smo narobe strukturirali url?)
- 418 (I'm a teapot) - Prvoaprilska šala - ok, tega verjetno ne bomo srečali, če se ne bomo res zelo potrudili (npr. https://www.google.com/teapot)
- 429 (Too many requests) - v kratkem času ste na spletno stran poslali preveč zahtevkov.
Preden se lotimo razčlenjevanja HTML, si v brskalniku oglejmo kodo spletne strani oziroma elementov, ki nas zanimajo (na primer: ime izdelka, cena, ...). Kakšna je struktura strani? Lahko identificiramo HTML značke, s pomočjo katerih bomo prišli do želenih podatkov? Preproste spletne strani lahko obdelamo kar z regularnimi izrazi (v Pythonu za to uporabimo paket re
, ki je del standardne namestitve Pythona). Za zahtevnejše spletne strani lahko uporabimo BeautifulSoup
, ki ustvari objekt za lažje premikanje in iskanje po kodi HTML. Če se naši podatki nahajajo v tabeli, nam morda lahko pomaga celo paket pandas
, ki je namenjen delu s tabelami in omogoč enostaven izvoz podatkov v datoteke.
Za primer enostavne skripte, ki s spletne strani pridobi podatke in jih s pomočjo BeautifulSoup
izvozi v datoteko tipa csv (comma separated values), si oglej datoteko pridobi_podatke.py
Glej datoteko baza.py.