Pridobivanje podatkov

Pridobivanje podatkov

Nekaj virov in dva trika

Tule bom nabral nekaj povezav na strani s podatki, za zdaj pa sta tu dva uporabna trika.

Poglavje 1: Wikidata

Obstaja fantastičen vir podatkov, le malo težko bi ga bilo uporabljati brez chatGPT. (In, ne, chatGPT ni prav dober vir podatkov, saj so prevečkrat napačni.)

Wikipedija ima vzporedni projekt, Wikidata. Ta je sestavljen iz entitet in relacij med njimi.

Za potrebe tega besedila sem šel na Wikipedijino stran o Zastavi 750, https://sl.wikipedia.org/wiki/Zastava_750. Nato sem pod »Orodja« kliknil Predmet v Wikipodatkih (Wikidata Item, če smo na angleški strani). To me je pripeljalo do strani https://www.wikidata.org/wiki/Q148237. Oglejte si jo!

Q148237 je ID entitete, ki predstavlja Zastavo 750. Med relacijami piše, recimo, da je Q148237 »instance of« Q3231690; pri čemer je Q3231690 »automobile model«. Z drugimi besedami, piše, da je Zastava 750 avto. Piše tudi, da je njegova teža 605 kg, je »followed by« Q21205906, to je, Yugo, izdelali so jih 923.847 in tako naprej.

Vse to je strašno zanimivo in lahko poberemo tudi v obliki json … vendar bomo za našo rabo potrebovali podatke o več rečeh iste vrste, recimo več avtomobilih. Do baze, iz katere je zložena ta stran, lahko dostopamo prek SPARQL-a. To je jezik za poizvedovanje po grafih, ki ga uporablja tudi Wikidata. In ga seveda ne znamo. :) Tu pa pride na vrsto chatGPT.

Enkrat sem ga vprašal:

Can you construct me a wikidata query for car
images that would give me a picture, model name,
manufacturer and state, and the year the car was
produced?

Pa je odgovoril:

Sure! Here is a SPARQL query for Wikidata that
retrieves images of cars along with their model
name, manufacturer, production start year, and
country of origin (state). You can run this query
using the [Wikidata Query Service].
SELECT ?car ?carLabel ?image ?manufacturerLabel ?countryLabel ?startYear WHERE {
  ?car wdt:P31 wd:Q3231690;  # Instance of automobile model
       wdt:P18 ?image;        # Image
       wdt:P176 ?manufacturer; # Manufacturer
       wdt:P571 ?inception.   # Inception (start year)

  OPTIONAL {
    ?manufacturer wdt:P17 ?country.  # Manufacturer's country of origin
  }

  BIND(YEAR(?inception) AS ?startYear)

  FILTER(?startYear >= 1920)  # Filter cars produced from 1920 onwards

  SERVICE wikibase:label { 
    bd:serviceParam wikibase:language "en". 
  }
}
ORDER BY ?startYear
LIMIT 100

Odpremo torej povezavo na Wikidata Query Service, https://query.wikidata.org/ in vanjo skopiramo gornjo poizvedbo. V odgovor dobimo tabelo, ki se začne tako:

Če nam je všeč, pobrišemo LIMIT 100 (ali ne, kakor je), pa dobimo vse zadetke.

Potem pod Prenos izberemo JSON ali TSV ali kar nam je ljubo, pa dobimo tabelo. CSV, recimo, bo takšen:

car,carLabel,image,manufacturerLabel,countryLabel,startYear
http://www.wikidata.org/entity/Q1647218,Rumpler Tropfenwagen,http://commons.wikimedia.org/wiki/Special:FilePath/Rumpler%20Tropfenwagen.jpg,Rumpler,,1921
http://www.wikidata.org/entity/Q1071289,Chevrolet Superior,http://commons.wikimedia.org/wiki/Special:FilePath/1926%20Chevrolet%20Superior%20Series%20V%20Touring%20GAG685.jpg,General Motors,United States,1923
http://www.wikidata.org/entity/Q1071111,Chevrolet Copper-Cooled,http://commons.wikimedia.org/wiki/Special:FilePath/Chevrolet%20cooper%20cooled%20car.jpg,General Motors,United States,1923
http://www.wikidata.org/entity/Q51562081,Voisin Laboratoire,http://commons.wikimedia.org/wiki/Special:FilePath/Voisin-C6-Laboratoire%20%281923%29.jpg,Avions Voisin,France,1923
http://www.wikidata.org/entity/Q412232,Ajax,http://commons.wikimedia.org/wiki/Special:FilePath/1926%20Ajax%204-door%20built%20by%20Nash%20at%202014%20Gettysburg%20AACA%20meet-01.jpg,Nash Motors,United States,1925

Tole je bil primer za avtomobile. Včasih nam bo tabela iz Wikidata že zadoščala — le malenkost jo bomo spremenili, uvozili v Orange (ali kamorkoli že) in uporabljali.

Včasih pa jo bomo še obdelali, recimo v Pythonu. Bi radi, recimo, pobrali s spleta vse te slike? To nabjrž znate napisati … če ne pa je vsak za takšne stvari chatGPT popolnoma adekvaten programer.

Poglavje 2: ChatGPT (z malo previdnosti)

Tule pa je ena vaja, kjer sem uporabil ChatGPT, ne Wikidata.

Give me a list of sixty popular sitcoms as
a Python list containing links to IMDB.

Bistvo, tule, je da sem zahteval seznam v Pythonu: tako je bilo lažje nadaljevati. Dobil sem tole:

sitcoms = [
    {"title": "Friends",
	 "imdb_link": "https://www.imdb.com/title/tt0108778/"},
    {"title": "Seinfeld",
	 "imdb_link": "https://www.imdb.com/title/tt0098904/"},
    {"title": "The Office (US)",
	 "imdb_link": "https://www.imdb.com/title/tt0386676/"},
    {"title": "Parks and Recreation",
	 "imdb_link": "https://www.imdb.com/title/tt1266020/"},

Tule je potrebno biti previden. Med povezavami, ki jih je naredil, so bile tri, štiri napačne — kazale so na čisto druge serije. ChatGPT ni zanesljiv vir podatkov, a tule ga je bilo lahko zalotiti v naslednjem koraku.

Za potrebe učne aktivnosti, ki sem jo sestavljal, sem namreč želel posterje teh serij. Na

What's the easiest way to download poster images?

nisem dobil pametnih odgovor, zato sem dodal

I want to do it programmatically.

pa mi je povedal za Open Movie Database ((https://www.omdbapi.com/)[https://www.omdbapi.com/]). Ta ima API, ki zahteva tvoj mail (s katerim ne počne nič grdega — vsaj z mojim ni), pa ti pošlje ključ, s katerim lahko narediš do 1000 zahtev dnevno.

Given a imdb tt code, and assuming my
apikey is 12345, how to I download from
omdb using python and urllib.request?

Pa mi je dal tole:

import urllib.request
import json

# Define your API key and IMDb tt code
api_key = "12345"
tt_code = "tt0111161"  # Example IMDb code for The Shawshank Redemption

# Construct the URL for the OMDb API
url = f"http://www.omdbapi.com/?apikey={api_key}&i={tt_code}"

try:
    # Make the request
    with urllib.request.urlopen(url) as response:
        # Read and decode the response
        data = response.read().decode("utf-8")
        # Parse the JSON
        movie_data = json.loads(data)
        # Output the result
        print(movie_data)
except Exception as e:
    print("An error occurred:", e)

In to je bilo to. :)