Jos markkinoija tarkistaa käsin kymmeniä julkisia IG-profiileja, suurin ajanhukka ei ole sivujen avaaminen vaan vertailukelpoisen historian puuttuminen. Yksi tilannekuva kertoo seuraajamäärän tänään; kahdesta tilannekuvasta voidaan laskea muutos valitulla aikavälillä. Yksinkertaisen profiiliseurannan voi automatisoida tekemällä pyynnön, tallentamalla vain tarvittavat kentät ja muodostamalla muutostaulukon.
Alla on pieni toimiva Python-esimerkki: se hakee profiilitiedot käyttäjänimen perusteella IG Scraper API:sta ja kirjoittaa aikaleimatun JSONL-rivin. Tuloksena on pieni historiatietolähde, jonka voi liittää croniin, n8n:ään tai omaan tallennusjärjestelmään. Reitin ja parametrien virallinen kuvaus löytyy IG API -dokumentaatiosta.
Mihin päivittäinen tilannekuva vastaa?
Oletetaan, että tiimi seuraa brändien tai kumppanien julkisia tilejä ja haluaa havaita muutoksia seuraajamäärässä, julkaisujen määrässä tai vahvistustilassa. Profiilisivulla näkyvät nykyiset arvot, mutta sivu ei itsessään säilytä edellisen viikon tietoja. Siksi on ensin määritettävä tärkeät kentät ja tallennettava ne havaintopäivämäärän kanssa.

Reitti \/v1\/user\/by\/username vaatii username-parametrin. Vastauksessa on muun muassa kentät follower_count, following_count, media_count, is_verified, is_private ja biography. Nämä sopivat profiilin tilannekuvaan; ne eivät sisällä julkaisuhistoriaa eivätkä itsessään selitä mittarien muutosten syitä.
Skripti on tarkoituksella rajattu: se hakee määritetyn kenttäjoukon tietyllä hetkellä ja vertaa sitä aiempiin merkintöihin. Näin analyytikko näkee esimerkiksi, että seuraajamäärä muuttui tallennettujen päivämäärien välillä, ja voi siirtyä erilliseen jatkotarkasteluun automaattisen keruun sijaan.
Valmistele avain ja tililuettelo
Asenna pyyntökirjasto ja aseta API-avain ympäristömuuttujaan. Älä sijoita salaisuutta lähdetiedostoon, repositorioon tai ohjelman tulosteeseen. API käyttää license_key-pyyntöparametria; alla oleva kirjasto muodostaa kyselymerkkijonon automaattisesti.
python -m pip install requests
export JSONSCRAPER_INSTAGRAM_LICENSE_KEY="oma_avaimesi"
Profiililuettelo kannattaa tallentaa määritystiedostoon tai projektin muuttujaan. Ensimmäisellä ajokerralla riittää yksi käyttäjänimi, jolla voi tarkistaa vastauksen, käyttöoikeuden ja tallennuksen. Esimerkissä username-kenttä annetaan API-parametrina ja avain luetaan vain ympäristöstä.
Tee pyyntö ja tallenna tilannekuva Pythonilla
Skripti tarkistaa HTTP-vastauksen, API:n ulkoisen tilan ja ig-objektin olemassaolon. Sen jälkeen se tallentaa vain kentät, jotka ovat nimenomaisesti saatavilla. Jos jokin kenttä puuttuu, merkintään jää null: nollan asettaminen sekoittaisi tuntemattoman arvon todelliseen nollaan.

import json
import os
from datetime import datetime, timezone
from pathlib import Path
import requests
API_URL = "https:\/\/ig.jsonscraper.com\/v1\/user\/by\/username"
LICENSE_KEY = os.environ["JSONSCRAPER_INSTAGRAM_LICENSE_KEY"]
USERNAME = "apple" # korvaa käyttäjänimellä omasta luettelostasi
OUTPUT = Path("instagram-profile-snapshots.jsonl")
response = requests.get(
API_URL,
params={"username": USERNAME, "license_key": LICENSE_KEY},
timeout=30,
)
response.raise_for_status()
payload = response.json()
if payload.get("status") != "ok" or not isinstance(payload.get("ig"), dict):
raise RuntimeError("API palautti odottamattoman tilan tai rakenteen")
profile = payload["ig"]
record = {
"observed_at": datetime.now(timezone.utc).isoformat(),
"username": profile.get("username", USERNAME),
"pk": profile.get("pk"),
"follower_count": profile.get("follower_count"),
"following_count": profile.get("following_count"),
"media_count": profile.get("media_count"),
"is_verified": profile.get("is_verified"),
"is_private": profile.get("is_private"),
}
with OUTPUT.open("a", encoding="utf-8") as file:
file.write(json.dumps(record, ensure_ascii=False) + "\n")
print("Tilannekuva tallennettu:", record["username"], record["observed_at"])
Koodiesimerkin kentät ja rakenne vastaavat tämän reitin profiilitietoja. Onnistunut pyyntö palauttaa pyynnönhetkisen havainnon; muutosten analysointia varten skripti on ajettava uudelleen ja jokainen tilannekuva tallennettava. IG Scraper API -sivulla näytetään peruspyyntö ja JSON-muotoinen esimerkkivastaus.
Laske tilannekuvien välinen muutos
JSONL-tiedostossa on yksi merkintä kullakin rivillä, joten sitä voi lukea Pythonin vakiomoduulilla. Seuraava katkelma valitsee profiilin kaksi viimeisintä merkintää ja laskee seuraajamäärän erotuksen. Tulos tulostetaan vain, jos molemmat merkinnät sisältävät numeerisen arvon.
import json
from pathlib import Path
rows = [
json.loads(line)
for line in Path("instagram-profile-snapshots.jsonl").read_text(encoding="utf-8").splitlines()
]
username = "apple"
profile_rows = [row for row in rows if row.get("username") == username]
profile_rows.sort(key=lambda row: row["observed_at"])
if len(profile_rows) >= 2:
previous, current = profile_rows[-2:]
old = previous.get("follower_count")
new = current.get("follower_count")
if isinstance(old, int) and isinstance(new, int):
print({
"username": username,
"from": previous["observed_at"],
"to": current["observed_at"],
"follower_delta": new - old,
})
Erotus koskee täsmälleen kahta valittua havaintoa. Jos ajoja jää väliin, niiden aikaväli pitenee; siksi raportissa on näytettävä molemmat päivämäärät eikä muutosta pidä automaattisesti kutsua päivän aikana tapahtuneeksi. Säännöllistä käyttöä varten ajoita suoritus cronilla tai pilvialustan ajastimella. n8n:ssä saman toimintaketjun voi rakentaa ajastin-, HTTP-pyyntö- ja tuloksen tietokantaan tai taulukkoon tallentavilla solmuilla; solmujen nimet ja tallennuksen kytkentä riippuvat asennuksestasi.
Laajenna seuranta useisiin profiileihin
Kun tilejä on useita, siirrä käyttäjänimet erilliseen tiedostoon ja käsittele niitä silmukassa. Tallenna kunkin pyynnön tila erikseen, jotta yhden profiilin virhe ei poista muiden onnistuneesti saatuja tietoja. Lisää aikakatkaisu, virheloki ja uusinta-ajo vain niille tileille, joiden pyynnöt epäonnistuivat.
Tietueen avaimena voi käyttää pk-arvoa, jos API palauttaa sen, ja tallentaa samalla käyttäjänimen luettavuuden parantamiseksi. Tunniste auttaa erottamaan profiilin raportin tekstimerkinnästä; jos arvoa ei ole, sitä ei pidä keksiä tai korvata toisella kentällä. Analytiikkaa varten kannattaa säilyttää alkuperäinen keruuaika UTC-aikavyöhykkeellä ja määritellä vertailujakso selvästi.
Jos tehtävään riittää tietojen noutaminen tietyllä tiheydellä, dokumentoidulla cache_timeout-parametrilla voi määrittää välimuistin keston sekunteina; IGin välimuisti on oletusarvoisesti pois käytöstä. Valitse kesto seurantavälin mukaan ja tallenna se keruuasetusten yhteyteen, jotta tuloksia tulkittaessa voidaan huomioida pyyntöparametrit.
Mitä lopputuloksena syntyy?
Muutaman ajokerran jälkeen sinulla on tiedosto, jossa on julkisten mittarien aikaleimatut tilannekuvat ja valittujen päivämäärien välinen yksinkertainen laskennallinen erotus. Tiedoston voi tuoda Google Sheetsiä, PostgreSQL:ää tai analytiikkajärjestelmää varten; erillinen käsittelykerros voi muodostaa ilmoituksen, kun muutos ylittää tiimin määrittelemän rajan. Raja on liiketoimintasääntösi, ei API:n sisäänrakennettu ominaisuus.
Profiilireitti palauttaa tilin kentät, joten uusien julkaisujen auditointiin tarvitaan niitä vastaava mediasisällön haku; media_count-arvosta ei voi päätellä julkaisujen sisältöä. IG API -dokumentaatiossa luetellaan erillinen julkaisujen hakureitti, jossa sivutettu haku käyttää user_id- ja end_cursor-parametreja. Käytä sitä, jos tehtävänä on tarkastella itse julkaisuja. Tässä kuvatun profiilimittarien historiataulukon tekemiseen riittää yksi pyyntö käyttäjää kohti ja tilannekuvien toistuva tallennus.
Aloita yhdestä profiilista ja parista ajokerrasta: varmista, että vastaustila on oikea, päivämäärät tallentuvat ja puuttuvat tiedot jäävät selvästi tuntemattomiksi. Lisää sen jälkeen tililuettelo ja ajastus. Näin saat toistettavan havainnon, jonka aikaväli ja alkuperäiset arvot ovat selkeitä ja jonka voi siirtää eteenpäin analytiikkaprosessiin.