Tak tu máme v tom evidentne poriadny hokej.
Táto slučka vyzerá na prvý pohľad ako problém:
while True:
content = await page.content()
soup = BeautifulSoup(content, 'html.parser')
data = await parse(data, soup, sport)
asyncio.sleep(1)
Vytvárať vlastné slučky pomocou while True je big, big no.
Asynchrónne programovanie je založené na slučke udalostí, ktorú však vytvorí
asyncio modul.
asyncio.run function runs the passed coroutine, taking care of managing the
asyncio event loop and finalizing asynchronous generators.
Takmer určite tvoj problém nespôsobil Puppeteer, ale chyba v tvojom programe.
Mne prijde, že sa snažíš vytvoriť pravdepodobne nejaký monitorovací skript.
Ak je to tak, tak si najpr treba vytvoriť skript, ktorý vykoná požadovaný task
a až potom neskôr riešiť monitoring.
Add puppeteer. Headless browser použiješ vtedy, ak sa potrebuješ dostať
za JS bránu, napr. za prihlasovacie okno. Pre ostatné prípady sa bežne
používajú http clienty. Python má httpx, ktorý zvládne aj async programy.
#!/usr/bin/python
import httpx
import asyncio
from bs4 import BeautifulSoup
async def get_async(url):
async with httpx.AsyncClient() as client:
return await client.get(url)
urls = ['http://webcode.me', 'https://httpbin.org',
'https://something.com', 'https://stackoverflow.com',
'https://github.com']
async def launch():
resps = await asyncio.gather(*map(get_async, urls))
data = [resp.text for resp in resps]
for content in data:
soup = BeautifulSoup(content, 'lxml')
print(soup.title)
asyncio.run(launch())
Príklad asynchrónne stiahne HTML kód z viacerých stránok, a výpíše ich
titulky.
Čo je ale vlastne tvoja požiadavka, o čo sa snažíš? Pojem
webscrawlingneexistuje, máme web scraping a web crawling. Web scraping je sťahovanie dát
z internetu, trebárs ceny leteniek k danému dňu. Web crawling je to, čo robí
Google.