Nauč se Python > Kurzy > Python a jeho knihovny > Scraping > Web Scraping

Web Scraping – Řešení [5]

import time

import requests
from bs4 import BeautifulSoup


URL = "https://en.wikipedia.org"
START = "/wiki/Special:Random"


def odstran_zavorky(text):
    # V kolika závorkách jsme vnoření. 0 = mimo závorky
    hloubka = 0
    # Jsme zrovna uvnitř nějakého HTML elementu?
    v_tagu = False
    vysledek = ""
    for znak in text:
        # Pokud jsme v nějakém elementu…
        if v_tagu:
            # …chceme zachovat veškerý text.
            vysledek += znak
            # Končí tady značka?
            if znak == ">":
                v_tagu = False
        else:
            if znak == "(":
                # Pokud vstupujeme do uzávorkovaného výrazu, jsme o jednu
                # úroveň hlouběji.
                hloubka += 1
            elif znak == ")":
                # Pokud vystupujeme, úroveň o jedna zmenšíme.
                hloubka -= 1
            elif hloubka == 0:
                # Jsme mimo závorky, chceme si znak nechat.
                vysledek += znak
                # Ale musíme zkontrolovat, jestli nevstupujeme do nějakého HTML
                # elementu.
                if znak == "<":
                    v_tagu = True

    return vysledek


def najdi_titulek(soup):
    return soup.find(id="firstHeading").text


def najdi_odkaz(soup):
    hlavni_text = soup.find(class_="mw-parser-output")
    for odstavec in hlavni_text.find_all("p"):
        print(odstavec)
        print(odstran_zavorky(str(odstavec)))
        for odkaz in odstavec.find_all("a"):
            print(odkaz)
            return odkaz.get("href")


def stahuj(stranka):
    navstivene = set()
    while True:
        if stranka in navstivene:
            break
        navstivene.add(stranka)

        odpoved = requests.get(URL + stranka)
        odpoved.raise_for_status()

        soup = BeautifulSoup(odpoved.text, "html.parser")
        print(najdi_titulek(soup))

        stranka = najdi_odkaz(soup)
        if not stranka:
            break

        time.sleep(1)


if __name__ == "__main__":
    stahuj(START)

Toto je stránka lekce z kurzu, který probíhá nebo proběhl naživo s instruktorem.