Pagrindinis / Python info surinkimas iš dinaminių (JavaScript) puslapių

Python info surinkimas iš dinaminių (JavaScript) puslapių

Šios programavimo pamokos metu, skaitysime turinį iš dinaminių puslapių. Iki šiol mes gaudavom statinį turinį, tą kuris yra iškart atvertus puslapį, tačiau, dalis turinio gali būti sukurta jau atvertus puslapį, su JavaScript pagalba. Tai sukuria keblumų naudojant tradicinius metodus, taigi apžvelgsime būdus su tuo kovoti.

Santrauka

Turinys

Problema

Gaunant turinį tradiciniais metodais (requests.get) gaunam tik pirminį turinį (statinį). Puslapyje esantis JavaScript kodas gali generuoti papildomą turinį, kurio mes nebematysime

Sprendimas

Gauti turinį naudojantis naršykle. Yra įrankiai, tokie kaip Selenium leidžiantys kontroliuoti naršyklę. Problema greitis. Nors iš akies žiūrint viskas vyksta labai greit, palyginus su tradiciniais metodais - tai yra neįtikėtinai lėtai.

Alternatyva - Pupeteer kuris daro iš esmės tą patį, bet kontroliuoja tik Chrome naršyklę ir naudoja specialią headless versiją, kuri pašalina viską kas nereikalinga (vartotojo sąsają ir t.t...), bet toliau kokybiškai interpretuoja JavaScript kodą.

Kadangi Pupeteer yra JavaScript biblioteka, nenorint toli nukrypti, naudosime Pyppeteer kas yra iš esmės ta pati biblioteka, tik su naršykle kalbasi Python kalba.

Kodo paruoštukas

from pyppeteer import launch

async def _scrape_dynamic(url):
    browser = await launch(headless=True)
    page = await browser.newPage()
    await page.goto(url)
    body = await page.querySelector('body')
    content = await page.evaluate("(body) => body.innerHTML", body)
    return content

Tai yra funkcija leidžianti gauti turinį iš dinaminio puslapio. Reik atkreipti dėmesį į async žodelį priekyje. Tai yra asinchroninė funkcija ir ja naudotis reikia atitinkamai.
Trumpai tariant, reikia liepti kodui sulaukti šios funkcijos rezultato.

Jupyter Notebook galima daryti tiesiog:

raw = await _scrape_dynamic(url)

Tačiau normaliu atveju prireiks:

import asyncio

asyncio.get_event_loop().run_until_complete(_scrape_dynamic(url))

Kodėl būtent taip? Na čia jau ilga istorija kitam kartui...

Autorius

Šarūnas Navickas
Šarūnas Navickas
Projekto iniciatorius, video autorius, puslapio programuotojas

Šiuo metu Duomenų Inžinierius Ovoko

Šis puslapis naudoja sausainėlius Kam naudojami sausainėliai?