logo

Implementácia škrabania webu v Pythone s BeautifulSoup

Existujú dva spôsoby, ako extrahovať údaje z webovej lokality:

  • Použite API webovej stránky (ak existuje). Napríklad Facebook má rozhranie Facebook Graph API, ktoré umožňuje získavanie údajov zverejnených na Facebooku.
  • Získajte prístup k HTML webovej stránky a extrahujte z nej užitočné informácie/údaje. Táto technika sa nazýva web scraping alebo web harvesting alebo extrakcia webových dát.

Tento článok pojednáva o krokoch pri zoškrabovaní webu pomocou implementácie rámca Web Scraping v jazyku Python s názvom Beautiful Soup. Kroky zapojené do zoškrabovania webu:



  1. Pošlite požiadavku HTTP na adresu URL webovej stránky, ku ktorej chcete pristupovať. Server odpovie na požiadavku vrátením obsahu HTML webovej stránky. Na túto úlohu použijeme knižnicu HTTP tretej strany pre požiadavky python.
  2. Keď sme sa dostali k obsahu HTML, zostáva nám úloha analyzovať údaje. Keďže väčšina údajov HTML je vnorená, nemôžeme údaje extrahovať jednoducho prostredníctvom spracovania reťazcov. Jeden potrebuje parser, ktorý dokáže vytvoriť vnorenú/stromovú štruktúru HTML údajov. Existuje veľa knižníc analyzátorov HTML, ale najpokročilejšia je html5lib.
  3. Teraz všetko, čo musíme urobiť, je navigovať a prehľadávať strom analýzy, ktorý sme vytvorili, t. j. prechod cez strom. Na túto úlohu použijeme inú knižnicu python tretej strany, Krásna polievka . Je to knižnica Python na vyťahovanie údajov zo súborov HTML a XML.

Krok 1: Inštalácia požadovaných knižníc tretích strán

  • Najjednoduchší spôsob, ako nainštalovať externé knižnice v pythone, je použiť pip. pip je systém správy balíkov, ktorý sa používa na inštaláciu a správu softvérových balíkov napísaných v jazyku Python. Všetko, čo musíte urobiť, je:
pip install requests pip install html5lib pip install bs4>

Krok 2: Prístup k obsahu HTML z webovej stránky

Python








import> requests> URL>=> 'https:>/>/>www.techcodeview.com>/>data>->structures>/>'> r>=> requests.get(URL)> print>(r.content)>

tostring metóda java

>

java random math random

>

Pokúsme sa pochopiť tento kus kódu.

  • Najprv importujte knižnicu požiadaviek.
  • Potom zadajte adresu URL webovej stránky, ktorú chcete zoškrabať.
  • Pošlite požiadavku HTTP na zadanú adresu URL a uložte odpoveď zo servera do objektu odpovede s názvom r.
  • Teraz, ako tlač r.content získať nespracovaný obsah HTML webovej stránky. Je typu „reťazec“.

Poznámka: Niekedy sa môže zobraziť chyba Neakceptované, preto skúste pridať používateľského agenta prehliadača, ako je uvedené nižšie. Tu nájdete svojho používateľského agenta podľa zariadenia a prehliadača https://deviceatlas.com/blog/list-of-user-agent-strings

Python3




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

bfs a dfs

Python




#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())>

>

>

mapa v jave

Naozaj pekná vec na knižnici BeautifulSoup je, že je postavená na vrchole knižníc analýzy HTML, ako sú html5lib, lxml, html.parser atď. Objekt BeautifulSoup a špecifikácia knižnice syntaktického analyzátora môžu byť vytvorené súčasne. Vo vyššie uvedenom príklade

soup = BeautifulSoup(r.content, 'html5lib')>

Objekt BeautifulSoup vytvoríme odovzdaním dvoch argumentov:

    r.content : Je to nespracovaný obsah HTML. html5lib : Určenie analyzátora HTML, ktorý chceme použiť.

Teraz soup.prettify() je vytlačený, poskytuje vizuálnu reprezentáciu stromu analýzy vytvoreného zo surového obsahu HTML. Krok 4: Vyhľadávanie a navigácia v strome analýzy Teraz by sme chceli extrahovať niektoré užitočné údaje z obsahu HTML. Objekt polievka obsahuje všetky údaje vo vnorenej štruktúre, ktoré je možné programovo extrahovať. V našom príklade zoškrabávame webovú stránku pozostávajúcu z niekoľkých úvodzoviek. Chceli by sme teda vytvoriť program na uloženie týchto cenových ponúk (a všetkých relevantných informácií o nich).

Python


15 zo 100,00



#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)>

>

>

Predtým, ako budete pokračovať, odporúčame vám prejsť si obsah HTML webovej stránky, ktorú sme vytlačili pomocou metódy soup.prettify() a pokúsiť sa nájsť vzor alebo spôsob, ako sa dostať k úvodzovkám.

  • Všimli sme si, že všetky úvodzovky sú v kontajneri div, ktorého id je „all_quotes“. Zistili sme teda, že prvok div (v kóde vyššie označený ako tabuľka) používame Nájsť() metóda:
table = soup.find('div', attrs = {'id':'all_quotes'})>
  • Prvý argument je značka HTML, ktorú chcete vyhľadať, a druhý argument je prvok typu slovníka, ktorý špecifikuje ďalšie atribúty spojené s touto značkou. Nájsť() metóda vráti prvý zodpovedajúci prvok. Môžete skúsiť vytlačiť table.prettify() aby ste získali predstavu o tom, čo tento kus kódu robí.
  • Teraz si v elemente tabuľky môžeme všimnúť, že každý citát je v kontajneri div, ktorého trieda je citát. Takže iterujeme cez každý kontajner div, ktorého trieda je citát. Tu používame metódu findAll(), ktorá je podobná metóde find z hľadiska argumentov, ale vracia zoznam všetkých zodpovedajúcich prvkov. Každý citát sa teraz iteruje pomocou premennej s názvom riadok. Tu je jeden vzorový riadok obsahu HTML pre lepšie pochopenie: Teraz zvážte tento kúsok 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)>
  • Vytvárame slovník na uloženie všetkých informácií o cenovej ponuke. Vnorená štruktúra je prístupná pomocou bodkovej notácie. Na prístup k textu vnútri prvku HTML používame .text :
quote['theme'] = row.h5.text>
  • Môžeme pridávať, odstraňovať, upravovať a pristupovať k atribútom značky. To sa dosiahne tak, že sa so značkou zaobchádza ako so slovníkom:
quote['url'] = row.a['href']>
  • Nakoniec sú všetky citácie pripojené k zoznamu tzv citácie.
  • Nakoniec by sme chceli všetky naše údaje uložiť do nejakého súboru CSV.
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)>
  • Tu vytvoríme súbor CSV s názvom inspiracia_citáty.csv a všetky citáty v ňom uložíme na ďalšie použitie.

Takže toto bol jednoduchý príklad, ako vytvoriť webový škrabák v Pythone. Odtiaľto sa môžete pokúsiť zrušiť akúkoľvek inú webovú stránku podľa vášho výberu. V prípade akýchkoľvek otázok ich napíšte nižšie do sekcie komentárov.

Poznámka : Sťahovanie webu sa v mnohých prípadoch považuje za nezákonné. Môže to tiež spôsobiť trvalé zablokovanie vašej adresy IP webovou stránkou. Do tohto blogu prispieva Nikhil Kumar .