Nejrychlejší a nejjednodušší headless browser na Python?

Zdravím. Chtěl bych se zeptat, jaký je nejrychlejší a nejednodušší headless browser s Javascriptem. Jde mi o webscrawling.

Momentálně používám headless Chrome přes Selenium, nedělám nic složitýho, ale žere to hrozně moc CPU. (Mám jich spuštěných několik současně).

Potřebuju, aby to umělo Javascript a hlavně fungovalo přes Python, Javu vůbec neumím.

Pokoušel sem se několik hodin rozjet Htmlunit přes selenium-server, ale za živýho boha sem nepřišel na to, jak to udělat.


Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #1 kdy: 29. 06. 2022, 23:12:57 »
Pyppeteer

Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #2 kdy: 30. 06. 2022, 00:54:46 »
Pyppeteer

Opravdu je to rychlejší než Selenium + Chrome? O hodně?

Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #3 kdy: 30. 06. 2022, 01:06:33 »
Pyppeteer

Opravdu je to rychlejší než Selenium + Chrome? O hodně?

v headless modu nejspis ano.

Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #4 kdy: 30. 06. 2022, 01:15:09 »
Mám jich spuštěných několik současně.

nekolik instanci pythonu nebo nekolik browseru? Ani jedno podle me neni treba, z jednoho skriptu jde otevrit nekolik url najednou v jednom browseru.


Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #5 kdy: 30. 06. 2022, 05:46:00 »
Pyppeteer

Opravdu je to rychlejší než Selenium + Chrome? O hodně?

v headless modu nejspis ano.

Díval sem se na to, problém je v tom, že to používá asyncio, který neumím :D

Tak sem se ho jakože začal učit, ale je to pro mě dost těžký :D Potřebuju otevřít několik tabů a neustále v nich checkovat zdroják.. Ty taby s požadovanou stránkou sem otevřel, to tak těžký nebylo.. ale aby to permanentně checkovalo zdroják, jak sem pochopil, tak asi nějak musím propojit asyncio + threading a to teda zatím nedávám :D


Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #6 kdy: 30. 06. 2022, 08:00:15 »
zrovna nedavno tu na asyncio vysly super clanky p tisnovskeho. (na druhou stranu on snad ani neumi napsat spatny clanek na cokoliv :) )

Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #7 kdy: 30. 06. 2022, 10:21:07 »
jak sem pochopil, tak asi nějak musím propojit asyncio + threading

nepochopil

Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #8 kdy: 30. 06. 2022, 15:16:20 »
zrovna nedavno tu na asyncio vysly super clanky p tisnovskeho. (na druhou stranu on snad ani neumi napsat spatny clanek na cokoliv :) )

Nevím, jestli sem špatně hledal, ale články byly spíš o threading a o asyncio je jen menší část jednoho z nich - https://www.root.cz/clanky/soubezne-a-paralelne-bezici-ulohy-naprogramovane-v-pythonu-2/#k09

Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #9 kdy: 30. 06. 2022, 16:37:25 »
jak sem pochopil, tak asi nějak musím propojit asyncio + threading

nepochopil

Můžu se zeptat, jak bys udělal, aby to současně parsovalo třeba pět stránek současně bez použití threading?

Nějak pomocí asyncio.Queue? Jakože jedna stránka bude hotová, pošle signál (nebo jak se tomu říká) další a takhle prostě budou postupovat postupně kolem dokola?

Když sem vytvořil 5 tasks přes asyncio.create_task(), tak to parsovalo jen 1 stránku a ostatní měly smůlu. Jedině když sem udělal parse(data) a následně time.sleep(X), tak to po skončení funkce parse(data) skončilo na další task.





Ink

  • *****
  • 529
    • Zobrazit profil
    • E-mail
Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #10 kdy: 30. 06. 2022, 18:08:14 »
jak sem pochopil, tak asi nějak musím propojit asyncio + threading

nepochopil

Můžu se zeptat, jak bys udělal, aby to současně parsovalo třeba pět stránek současně bez použití threading?

Nějak pomocí asyncio.Queue? Jakože jedna stránka bude hotová, pošle signál (nebo jak se tomu říká) další a takhle prostě budou postupovat postupně kolem dokola?

Když sem vytvořil 5 tasks přes asyncio.create_task(), tak to parsovalo jen 1 stránku a ostatní měly smůlu. Jedině když sem udělal parse(data) a následně time.sleep(X), tak to po skončení funkce parse(data) skončilo na další task.

Hele a Google Ti nefunguje? https://stackoverflow.com/questions/28492103/how-to-combine-python-asyncio-with-threads

Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #11 kdy: 30. 06. 2022, 18:59:21 »
jak sem pochopil, tak asi nějak musím propojit asyncio + threading

nepochopil

Můžu se zeptat, jak bys udělal, aby to současně parsovalo třeba pět stránek současně bez použití threading?

Nějak pomocí asyncio.Queue? Jakože jedna stránka bude hotová, pošle signál (nebo jak se tomu říká) další a takhle prostě budou postupovat postupně kolem dokola?

Když sem vytvořil 5 tasks přes asyncio.create_task(), tak to parsovalo jen 1 stránku a ostatní měly smůlu. Jedině když sem udělal parse(data) a následně time.sleep(X), tak to po skončení funkce parse(data) skončilo na další task.

Hele a Google Ti nefunguje? https://stackoverflow.com/questions/28492103/how-to-combine-python-asyncio-with-threads

on tohle nepotrebuje, to se pouziva, kdyz potrebujes v asyncio aplikaci blokujici volani. pyppeteer je plne neblokujici.

to co chce (vic tabu v jednom browseru) by slo i pomoci selenia a vlaken

Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #12 kdy: 30. 06. 2022, 19:41:52 »
jak sem pochopil, tak asi nějak musím propojit asyncio + threading

nepochopil

Můžu se zeptat, jak bys udělal, aby to současně parsovalo třeba pět stránek současně bez použití threading?

Nějak pomocí asyncio.Queue? Jakože jedna stránka bude hotová, pošle signál (nebo jak se tomu říká) další a takhle prostě budou postupovat postupně kolem dokola?

Když sem vytvořil 5 tasks přes asyncio.create_task(), tak to parsovalo jen 1 stránku a ostatní měly smůlu. Jedině když sem udělal parse(data) a následně time.sleep(X), tak to po skončení funkce parse(data) skončilo na další task.

priklad

Kód: [Vybrat]
import asyncio
from pyppeteer import launch


async def get_title(browser, url):
    page = await browser.newPage()
    await page.goto(url)
    return await page.title()


async def get_titles(*urls):
    browser = await launch()
    titles = await asyncio.gather(
        *[asyncio.create_task(get_title(browser, url)) for url in urls]
    )
    await browser.close()
    return titles


print(asyncio.run(get_titles("https://example.com", "https://google.com")))

vypise ['Example Domain', 'Google']

Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #13 kdy: 01. 07. 2022, 01:13:17 »
jak sem pochopil, tak asi nějak musím propojit asyncio + threading

nepochopil

Můžu se zeptat, jak bys udělal, aby to současně parsovalo třeba pět stránek současně bez použití threading?

Nějak pomocí asyncio.Queue? Jakože jedna stránka bude hotová, pošle signál (nebo jak se tomu říká) další a takhle prostě budou postupovat postupně kolem dokola?

Když sem vytvořil 5 tasks přes asyncio.create_task(), tak to parsovalo jen 1 stránku a ostatní měly smůlu. Jedině když sem udělal parse(data) a následně time.sleep(X), tak to po skončení funkce parse(data) skončilo na další task.

Hele a Google Ti nefunguje? https://stackoverflow.com/questions/28492103/how-to-combine-python-asyncio-with-threads

Google mi samozřejmě funguje a taky než sem položil otázku, tak sem zabil docela hodně času pokusem přijít na to sám. Ale tuhle konkrétní věc sem prostě nikde kloudně nenašel no.

Btw až po docela dlouhý době sem se pak někde dočetl, že threading/concurrent.futures/asyncio ty souběhy/konkurenci řeší vlastně všechny a že je blbost ty metody kombinovat, jen to prej přináší problémy.

Re:Nejrychlejší a nejjednodušší headless browser na Python?
« Odpověď #14 kdy: 01. 07. 2022, 01:13:52 »
jak sem pochopil, tak asi nějak musím propojit asyncio + threading

nepochopil

Můžu se zeptat, jak bys udělal, aby to současně parsovalo třeba pět stránek současně bez použití threading?

Nějak pomocí asyncio.Queue? Jakože jedna stránka bude hotová, pošle signál (nebo jak se tomu říká) další a takhle prostě budou postupovat postupně kolem dokola?

Když sem vytvořil 5 tasks přes asyncio.create_task(), tak to parsovalo jen 1 stránku a ostatní měly smůlu. Jedině když sem udělal parse(data) a následně time.sleep(X), tak to po skončení funkce parse(data) skončilo na další task.

priklad

Kód: [Vybrat]
import asyncio
from pyppeteer import launch


async def get_title(browser, url):
    page = await browser.newPage()
    await page.goto(url)
    return await page.title()


async def get_titles(*urls):
    browser = await launch()
    titles = await asyncio.gather(
        *[asyncio.create_task(get_title(browser, url)) for url in urls]
    )
    await browser.close()
    return titles


print(asyncio.run(get_titles("https://example.com", "https://google.com")))

vypise ['Example Domain', 'Google']

diky moc!