Iš esmės yra du būdai išgauti duomenis iš svetainės:
- Naudokite svetainės API (jei ji yra). Pavyzdžiui, „Facebook“ turi „Facebook Graph“ API, leidžiančią gauti „Facebook“ paskelbtus duomenis.
- Pasiekite tinklalapio HTML ir iš jo ištraukite naudingą informaciją/duomenis. Ši technika vadinama žiniatinklio nuskaitymu arba žiniatinklio rinkimu arba žiniatinklio duomenų išgavimu.
Šiame straipsnyje aptariami žingsniai, susiję su žiniatinklio nuskaitymu, naudojant Python Web Scraping sistemą, vadinamą Beautiful Soup. Žingsniai, susiję su žiniatinklio grandinėjimu:
- Siųskite HTTP užklausą į tinklalapio, kurį norite pasiekti, URL. Serveris atsako į užklausą grąžindamas tinklalapio HTML turinį. Šiai užduočiai python užklausoms naudosime trečiosios šalies HTTP biblioteką.
- Kai pasiekiame HTML turinį, mums belieka išanalizuoti duomenis. Kadangi dauguma HTML duomenų yra įdėta, negalime išgauti duomenų tiesiog apdorojant eilutes. Reikia analizatoriaus, kuris gali sukurti HTML duomenų įdėtą / medžio struktūrą. Yra daug HTML analizavimo bibliotekų, tačiau pažangiausia yra html5lib.
- Dabar viskas, ką turime padaryti, tai naršyti ir ieškoti mūsų sukurtame analizavimo medyje, t. y. medžio perėjimas. Šiai užduočiai atlikti naudosime kitą trečiosios šalies python biblioteką, Graži sriuba . Tai Python biblioteka, skirta ištraukti duomenis iš HTML ir XML failų.
1 veiksmas: įdiekite reikiamas trečiųjų šalių bibliotekas
- Lengviausias būdas įdiegti išorines bibliotekas python yra naudoti pip. pip yra paketų valdymo sistema, naudojama įdiegti ir valdyti programinės įrangos paketus, parašytus Python. Viskas, ką jums reikia padaryti, tai:
pip install requests pip install html5lib pip install bs4>
- Kitas būdas yra atsisiųsti juos rankiniu būdu iš šių nuorodų:
2 veiksmas: prieiga prie HTML turinio iš tinklalapio
Python
import> requests> URL> => 'https:> /> /> www.techcodeview.com> /> data> -> structures> /> '> r> => requests.get(URL)> print> (r.content)> |
>
>
Pabandykime suprasti šią kodo dalį.
- Pirmiausia importuokite užklausų biblioteką.
- Tada nurodykite tinklalapio, kurį norite nuskaityti, URL.
- Nusiųskite HTTP užklausą nurodytu URL ir išsaugokite atsakymą iš serverio atsakymo objekte, pavadintame r.
- Dabar, kaip spausdinti r.content gauti neapdoroto HTML turinio tinklalapio. Tai yra „stygos“ tipo.
Pastaba: kartais galite gauti klaidą Nepriimta, todėl pabandykite pridėti naršyklės vartotojo agentą, kaip nurodyta toliau. Iš čia raskite savo vartotojo agentą pagal įrenginį ir naršyklę https://deviceatlas.com/blog/list-of-user-agent-strings
java eilutę palyginkite
Python3
c kodo eilučių masyvas
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)> |
>
>
3 veiksmas: HTML turinio analizė
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())> |
>
>
Labai gražus „BeautifulSoup“ bibliotekos dalykas yra tas, kad ji yra sukurta ant HTML analizavimo bibliotekų, tokių kaip html5lib, lxml, html.parser ir tt, viršuje. Taigi „BeautifulSoup“ objektas ir nurodyti analizavimo biblioteką gali būti sukurti tuo pačiu metu. Aukščiau pateiktame pavyzdyje
soup = BeautifulSoup(r.content, 'html5lib')>
Mes sukuriame 'BeautifulSoup' objektą perduodami du argumentus:
importo ant
- r.content : tai neapdorotas HTML turinys. html5lib : nurodomas HTML analizatorius, kurį norime naudoti.
Dabar soup.prettify() yra atspausdintas, jis pateikia vaizdinį analizavimo medžio, sukurto iš neapdoroto HTML turinio, vaizdą. 4 veiksmas: ieškokite ir naršykite analizavimo medyje Dabar norėtume iš HTML turinio išgauti keletą naudingų duomenų. Sriubos objekte yra visi įdėtosios struktūros duomenys, kuriuos galima programiškai išgauti. Mūsų pavyzdyje mes nuskaitome tinklalapį, kurį sudaro keletas citatų. Taigi, norėtume sukurti programą, kuri išsaugotų tas citatas (ir visą susijusią informaciją apie jas).
Python
#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)> |
>
>
Prieš tęsiant, rekomenduojame peržiūrėti tinklalapio HTML turinį, kurį išspausdinome naudodami soup.prettify() metodą, ir pabandyti rasti šabloną arba būdą, kaip pereiti prie citatų.
- Pastebėta, kad visos kabutės yra „div“ konteineryje, kurio ID yra „all_quotes“. Taigi, mes randame tą div elementą (vadinamą lentele aukščiau esančiame kode) naudodami rasti () metodas:
table = soup.find('div', attrs = {'id':'all_quotes'})>
- Pirmasis argumentas yra HTML žyma, kurios norite ieškoti, o antrasis argumentas yra žodyno tipo elementas, skirtas nurodyti papildomus atributus, susietus su ta žyma. rasti () metodas grąžina pirmąjį atitinkantį elementą. Galite pabandyti spausdinti table.prettify() kad suprastumėte, ką daro ši kodo dalis.
- Dabar lentelės elemente galima pastebėti, kad kiekviena citata yra div konteineryje, kurio klasė yra citata. Taigi, kartojame kiekvieną div konteinerį, kurio klasė yra citata. Čia mes naudojame FindAll () metodą, kuris yra panašus į paieškos metodą argumentų požiūriu, tačiau jis pateikia visų atitinkančių elementų sąrašą. Kiekviena citata dabar kartojama naudojant kintamąjį, vadinamą eilė. Čia yra vienas HTML turinio eilutės pavyzdys, kad būtų geriau suprasti:
Dabar apsvarstykite šią kodo dalį:
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)>
- Sukuriame žodyną, kad išsaugotume visą informaciją apie citatą. Įdėtą struktūrą galima pasiekti naudojant taškų žymėjimą. Norėdami pasiekti tekstą HTML elemente, naudojame .text :
quote['theme'] = row.h5.text>
- Galime pridėti, pašalinti, modifikuoti ir pasiekti žymos atributus. Tai atliekama laikant žymą kaip žodyną:
quote['url'] = row.a['href']>
- Galiausiai visos citatos pridedamos prie sąrašo, vadinamo citatos.
- Galiausiai norėtume išsaugoti visus savo duomenis kokiame nors CSV faile.
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)>
- Čia sukuriame CSV failą, pavadintą inspirational_quotes.csv, ir išsaugome visas jame esančias citatas, kad būtų galima naudoti toliau.
Taigi, tai buvo paprastas pavyzdys, kaip Python sukurti žiniatinklio grandiklį. Iš čia galite pabandyti panaikinti bet kurią kitą pasirinktą svetainę. Jei turite klausimų, pateikite juos komentarų skiltyje.
Pastaba: Žiniatinklio išgryninimas daugeliu atvejų laikomas neteisėtu. Be to, svetainė gali visam laikui užblokuoti jūsų IP adresą. Prie šio tinklaraščio prisideda Nikhilas Kumaras .