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...