Existují dva způsoby, jak extrahovat data z webu:
- Použijte API webu (pokud existuje). Například Facebook má Facebook Graph API, které umožňuje načítání dat zveřejněných na Facebooku.
- Získejte přístup k HTML webové stránky a extrahujte z ní užitečné informace/data. Tato technika se nazývá web scraping nebo web harvesting nebo extrakce webových dat.
Tento článek pojednává o krocích souvisejících s webovým scrapingem pomocí implementace Web Scraping frameworku Pythonu s názvem Beautiful Soup. Kroky zapojené do stírání webu:
- Odešlete požadavek HTTP na adresu URL webové stránky, na kterou chcete získat přístup. Server na požadavek odpoví vrácením obsahu HTML webové stránky. Pro tento úkol použijeme HTTP knihovnu třetí strany pro python-requests.
- Jakmile se dostaneme k obsahu HTML, zbývá nám úkol analyzovat data. Protože většina dat HTML je vnořená, nemůžeme data extrahovat jednoduše zpracováním řetězců. Člověk potřebuje parser, který dokáže vytvořit vnořenou/stromovou strukturu HTML dat. Existuje mnoho knihoven analyzátorů HTML, ale nejpokročilejší je html5lib.
- Nyní vše, co musíme udělat, je procházet a prohledávat strom analýzy, který jsme vytvořili, tj. procházení stromu. Pro tento úkol budeme používat jinou pythonovou knihovnu třetí strany, Krásná polévka . Je to knihovna Python pro stahování dat ze souborů HTML a XML.
Krok 1: Instalace požadovaných knihoven třetích stran
- Nejjednodušší způsob, jak nainstalovat externí knihovny v pythonu, je použít pip. pip je systém pro správu balíčků používaný k instalaci a správě softwarových balíčků napsaných v Pythonu. Vše, co musíte udělat, je:
pip install requests pip install html5lib pip install bs4>
- Dalším způsobem je stáhnout je ručně z těchto odkazů:
Krok 2: Přístup k obsahu HTML z webové stránky
Krajta
podřetězec v jazyce Java
import> requests> URL> => 'https:> /> /> www.techcodeview.com> /> data> -> structures> /> '> r> => requests.get(URL)> print> (r.content)> |
>
>
Pokusme se porozumět tomuto kusu kódu.
- Nejprve importujte knihovnu požadavků.
- Poté zadejte adresu URL webové stránky, kterou chcete seškrábat.
- Odešlete požadavek HTTP na zadanou adresu URL a uložte odpověď ze serveru do objektu odpovědi s názvem r.
- Nyní, jako tisk r.content získat nezpracovaný obsah HTML webové stránky. Je typu „řetězec“.
Poznámka: Někdy se může zobrazit chyba Nepřijímáno, takže zkuste přidat uživatelského agenta prohlížeče, jak je uvedeno níže. Zde najdete svého uživatelského agenta podle zařízení a prohlížeče https://deviceatlas.com/blog/list-of-user-agent-strings
Python3
unie vs
headers> => {> 'User-Agent'> :> 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'> }> # Here the user agent is for Edge browser on windows 10. You can find your browser user agent from the above given link.> r> => requests.get(url> => URL, headers> => headers)> print> (r.content)> |
>
>
Krok 3: Analýza obsahu HTML
Krajta
#This will not run on online IDE> import> requests> from> bs4> import> BeautifulSoup> > URL> => 'http:> /> /> www.values.com> /> inspirational> -> quotes'> r> => requests.get(URL)> > soup> => BeautifulSoup(r.content,> 'html5lib'> )> # If this line causes an error, run 'pip install html5lib' or install html5lib> print> (soup.prettify())> |
>
>
Opravdu pěkná věc na knihovně BeautifulSoup je, že je postavena na horní části knihoven pro analýzu HTML, jako jsou html5lib, lxml, html.parser atd. Objekt BeautifulSoup a specifikaci knihovny parseru lze tedy vytvořit současně. Ve výše uvedeném příkladu
soup = BeautifulSoup(r.content, 'html5lib')>
Objekt BeautifulSoup vytvoříme předáním dvou argumentů:
- r.content: Jedná se o surový obsah HTML. html5lib : Zadání analyzátoru HTML, který chceme použít.
Nyní soup.prettify() je vytištěno, poskytuje vizuální reprezentaci stromu analýzy vytvořeného z nezpracovaného obsahu HTML. Krok 4: Vyhledávání a procházení stromu analýzy Nyní bychom rádi extrahovali některá užitečná data z obsahu HTML. Objekt soup obsahuje všechna data ve vnořené struktuře, která by mohla být programově extrahována. V našem příkladu škrábeme webovou stránku obsahující několik uvozovek. Rádi bychom tedy vytvořili program na ukládání těchto nabídek (a všech relevantních informací o nich).
Krajta
#Python program to scrape website> #and save quotes from website> import> requests> from> bs4> import> BeautifulSoup> import> csv> > URL> => 'http:> /> /> www.values.com> /> inspirational> -> quotes'> r> => requests.get(URL)> > soup> => BeautifulSoup(r.content,> 'html5lib'> )> > quotes> => []> # a list to store quotes> > table> => soup.find(> 'div'> , attrs> => {> 'id'> :> 'all_quotes'> })> > for> row> in> table.findAll(> 'div'> ,> > attrs> => {> 'class'> :> 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'> }):> > quote> => {}> > quote[> 'theme'> ]> => row.h5.text> > quote[> 'url'> ]> => row.a[> 'href'> ]> > quote[> 'img'> ]> => row.img[> 'src'> ]> > quote[> 'lines'> ]> => row.img[> 'alt'> ].split('> #')[0]> > quote[> 'author'> ]> => row.img[> 'alt'> ].split('> #')[1]> > quotes.append(quote)> > filename> => 'inspirational_quotes.csv'> with> open> (filename,> 'w'> , newline> => '') as f:> > w> => csv.DictWriter(f,[> 'theme'> ,> 'url'> ,> 'img'> ,> 'lines'> ,> 'author'> ])> > w.writeheader()> > for> quote> in> quotes:> > w.writerow(quote)> |
>
>
salman khan věk
Než budete pokračovat, doporučujeme vám projít si obsah HTML webové stránky, kterou jsme vytiskli pomocí metody soup.prettify() a pokusit se najít vzor nebo způsob, jak přejít k uvozovkám.
- Všimli jsme si, že všechny uvozovky jsou uvnitř kontejneru div, jehož id je „all_quotes“. Zjistíme tedy, že prvek div (ve výše uvedeném kódu nazývaný jako tabulka) používáme nalézt() metoda:
table = soup.find('div', attrs = {'id':'all_quotes'})>
- První argument je značka HTML, kterou chcete prohledat, a druhý argument je prvek typu slovníku, který určuje další atributy spojené s touto značkou. nalézt() metoda vrací první odpovídající prvek. Můžete zkusit tisknout table.prettify() abyste získali představu o tom, co tento kus kódu dělá.
- Nyní si v elementu table můžeme všimnout, že každý citát je uvnitř kontejneru div, jehož třída je citát. Takže iterujeme každý kontejner div, jehož třída je quote. Zde používáme metodu findAll(), která je podobná metodě find z hlediska argumentů, ale vrací seznam všech odpovídajících prvků. Každá nabídka je nyní iterována pomocí proměnné s názvem řádek. Zde je jeden ukázkový obsah HTML pro lepší pochopení:
Nyní zvažte tento kus kódu:
for row in table.find_all_next('div', attrs = {'class': 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}): quote = {} quote['theme'] = row.h5.text quote['url'] = row.a['href'] quote['img'] = row.img['src'] quote['lines'] = row.img['alt'].split(' #')[0] quote['author'] = row.img['alt'].split(' #')[1] quotes.append(quote)>
- Vytvoříme slovník pro uložení všech informací o nabídce. Vnořená struktura je přístupná pomocí tečkové notace. Pro přístup k textu uvnitř elementu HTML používáme .text :
quote['theme'] = row.h5.text>
- Můžeme přidávat, odebírat, upravovat a přistupovat k atributům tagu. Toho se dosáhne tak, že se se značkou bude zacházet jako se slovníkem:
quote['url'] = row.a['href']>
- Nakonec jsou všechny uvozovky připojeny k seznamu volaných citáty.
- Nakonec bychom rádi všechna naše data uložili do nějakého CSV souboru.
filename = 'inspirational_quotes.csv' with open(filename, 'w', newline='') as f: w = csv.DictWriter(f,['theme','url','img','lines','author']) w.writeheader() for quote in quotes: w.writerow(quote)>
- Zde vytvoříme soubor CSV s názvem inspirativní_quotes.csv a všechny citace v něm uložíme pro jakékoli další použití.
Toto byl jednoduchý příklad toho, jak vytvořit webový škrabák v Pythonu. Odtud se můžete pokusit zrušit jakýkoli jiný web podle svého výběru. V případě jakýchkoliv dotazů je napište níže do sekce komentářů.
Poznámka : Web Scraping je v mnoha případech považován za nezákonný. Může to také způsobit trvalé zablokování vaší IP webovou stránkou. Na tomto blogu přispívá Nikhil Kumar .