Oppikaa tekoälyä Pythonilla · Oppitunti

Sivutus ja suurten aineistojen kerääminen

Sivutuksen käsittely, next_cursor-mallit, nopeusrajoitukset time.sleepillä ja edistymispalkit.

Oppitunti 2/413 vaihetta

Sivutus ja suurten aineistojen kerääminen on ilmainen Oppikaa tekoälyä Pythonilla-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Oppikaa tekoälyä Pythonilla-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Oppikaa tekoälyä Pythonilla-kurssilla on yhteensä 4 oppituntia.

Miksi sivutus on tarpeen

API:t palauttavat harvoin miljoonia tietueita yhdessä vastauksessa. Ne jakavat tulokset sivuille, jotta jokainen vastaus pysyy pienenä ja nopeana.

Koko aineiston keräämiseksi jokainen sivu on käytävä läpi silmukassa ja tulokset yhdistettävä. Tässä oppitunnissa käsitellään yleisiä sivutustapoja sekä pyyntöjen rajoittamista ja edistymisen seurantaa.

Sivunumerointi sivutuksessa

Yksinkertaisimmassa menetelmässä käytetään parametria page. Kasvattakaa sen arvoa, kunnes API palauttaa tyhjän sivun.

import requests

all_items = []
page = 1
while True:
    resp = requests.get(url, params={"page": page, "per_page": 100}, timeout=10)
    resp.raise_for_status()
    items = resp.json()
    if not items:
        break
    all_items.extend(items)
    page += 1
print(len(all_items), "items collected")

Kursori- ja seuraavan URL-osoitteen käyttö sivutuksessa

Monet nykyaikaiset API:t palauttavat seuraavan sivun URL-osoitteen tai seuraavalle sivulle osoittavan kursoritunnisteen. Jatkakaa silmukkaa niin kauan kuin seuraava linkki on olemassa.

Tämä on luotettava tapa, koska palvelin määrittää, mistä seuraava sivu alkaa.

all_items = []
next_url = "https://api.example.com/items?limit=100"
while next_url:
    resp = requests.get(next_url, timeout=10)
    resp.raise_for_status()
    data = resp.json()
    all_items.extend(data["results"])
    next_url = data.get("next")   # None when no more pages
print(len(all_items))

Pyyntörajoitusten noudattaminen time.sleep-funktiolla

API:t rajoittavat, kuinka monta pyyntöä saatte lähettää sekunnissa tai minuutissa. Liiallinen kuormittaminen palauttaa vastauksen 429 Too Many Requests tai johtaa estämiseen.

Lisätkää pyyntöjen väliin lyhyt time.sleep, jotta toimitte kohteliaasti ja pysytte rajoituksen alapuolella.

import time

while next_url:
    resp = requests.get(next_url, timeout=10)
    resp.raise_for_status()
    data = resp.json()
    all_items.extend(data["results"])
    next_url = data.get("next")
    time.sleep(0.5)   # 2 requests per second

Pyyntörajoitusotsakkeiden lukeminen

Hyvin suunnitellut API:t ilmoittavat jäljellä olevan kiintiönne otsakkeissa, kuten X-RateLimit-Remaining ja X-RateLimit-Reset.

Voitte lukea nämä arvot ja hidastaa pyyntöjä vasta, kun lähestytte rajoitusta, sen sijaan että odottaisitte aina.

remaining = int(resp.headers.get("X-RateLimit-Remaining", 1))
if remaining < 5:
    reset = int(resp.headers.get("X-RateLimit-Reset", 1))
    print("Near limit, sleeping", reset, "s")
    time.sleep(reset)

429-virheiden käsittely backoff-menetelmällä

Jos saatte vastauksen 429, vastaus sisältää usein Retry-After-otsakkeen, joka kertoo, kuinka kauan pitää odottaa. Noudattakaa tätä ohjetta ennen uutta yritystä.

resp = requests.get(url, timeout=10)
if resp.status_code == 429:
    wait = int(resp.headers.get("Retry-After", 5))
    time.sleep(wait)
    resp = requests.get(url, timeout=10)   # retry once

Edistymispalkit tqdm-kirjastolla

Pitkät keräystehtävät vaikuttavat jumittuneilta, jos palautetta ei ole saatavilla. tqdm käärii minkä tahansa iteroitavan olion ja tulostaa reaaliaikaisen edistymispalkin, jossa näkyvät nopeus ja arvioitu jäljellä oleva aika.

from tqdm import tqdm

for page in tqdm(range(1, 101), desc="Fetching"):
    resp = requests.get(url, params={"page": page}, timeout=10)
    all_items.extend(resp.json())
    time.sleep(0.2)

tqdm, kun kokonaismäärä ei ole tiedossa

Kursorisivutuksessa kokonaismäärää ei tiedetä etukäteen. Käyttäkää tqdm-kirjastoa manuaalisena laskurina ja kutsukaa update()-metodia jokaisella silmukan kierroksella.

from tqdm import tqdm

pbar = tqdm(desc="Pages")
while next_url:
    resp = requests.get(next_url, timeout=10)
    data = resp.json()
    all_items.extend(data["results"])
    next_url = data.get("next")
    pbar.update(1)
pbar.close()

Datan vaiheittainen kerääminen

Älkää säilyttäkö kaikkea muistissa suurten aineistojen yhteydessä. Vaiheittainen kerääminen kirjoittaa jokaisen sivun levylle sen saapuessa, joten kaatuminen ei hävitä kaikkea edistymistä.

import json

with open("items.jsonl", "w") as f:
    while next_url:
        resp = requests.get(next_url, timeout=10)
        data = resp.json()
        for item in data["results"]:
            f.write(json.dumps(item) + "\n")
        next_url = data.get("next")

Jatkamiskelpoisen keräyksen toteuttaminen

Tallentakaa viimeisin kursori tai sivunumero, jotta uudelleenkäynnistys voi jatkaa siitä eikä aloittaa alusta. Näin pitkistä tehtävistä tulee vikasietoisia.

import os

start_page = 1
if os.path.exists("checkpoint.txt"):
    start_page = int(open("checkpoint.txt").read()) + 1

for page in range(start_page, 1000):
    # ... fetch and store ...
    open("checkpoint.txt", "w").write(str(page))

Kokonaisuuden yhdistäminen

Tuotantokäyttöön tarkoitettu keräyssilmukka yhdistää kaikki osat: sivuttaa, odottaa pyyntörajoitusten mukaisesti, näyttää edistymisen, kirjoittaa dataa vaiheittain ja tallentaa tarkistuspisteitä.

from tqdm import tqdm
import time, json

with open("out.jsonl", "a") as f:
    next_url = "https://api.example.com/items?limit=100"
    pbar = tqdm(desc="Pages")
    while next_url:
        r = requests.get(next_url, timeout=10)
        r.raise_for_status()
        d = r.json()
        for it in d["results"]:
            f.write(json.dumps(it) + "\n")
        next_url = d.get("next")
        pbar.update(1)
        time.sleep(0.3)

Pikatarkistus: kursorisivutus

API palauttaa "next"-kentän, joka sisältää URL-osoitteen, tai arvon None viimeisellä sivulla.

Kertaus: suurten aineistojen kerääminen

Osaatte nyt kerätä usealle sivulle ulottuvia aineistoja:

  • sivunumerointiin ja kursoriin perustuva sivutus (while next_url)
  • time.sleep ja pyyntörajoitusotsakkeet 429-virheiden välttämiseen
  • Retry-After-otsakkeen mukainen backoff rajoitustilanteissa
  • tqdm-edistymispalkit pitkiin tehtäviin
  • vaiheittainen ja jatkamiskelpoinen kirjoittaminen vikasietoisuutta varten

Seuraavaksi tallennetaan kerätty data tehokkaasti.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
53
Oppitunnit
225

Usein kysytyt kysymykset

Onko oppitunti ”Sivutus ja suurten aineistojen kerääminen” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Oppikaa tekoälyä Pythonilla-oppimispolun 3 oppituntia, myös oppitunnin “Sivutus ja suurten aineistojen kerääminen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppikaa tekoälyä Pythonilla-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Sivutus ja suurten aineistojen kerääminen”?

Sivutuksen käsittely, next_cursor-mallit, nopeusrajoitukset time.sleepillä ja edistymispalkit. Harjoittelet Oppikaa tekoälyä Pythonilla-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Oppikaa tekoälyä Pythonilla-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Oppikaa tekoälyä Pythonilla-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Sivutus ja suurten aineistojen kerääminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Oppikaa tekoälyä Pythonilla-oppitunnilla?

Kyllä. Jokainen Oppikaa tekoälyä Pythonilla-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. REST API -rajapintojen perusteet datan keruuseen
  2. Sivutus ja suurten aineistojen kerääminen
  3. Kerätyn datan tehokas tallentaminen
  4. Julkisten data-API:en käyttäminen
← Takaisin: Oppikaa tekoälyä Pythonilla