logo

Implementacija spletnega strganja v Pythonu z BeautifulSoup

Obstajata predvsem dva načina za pridobivanje podatkov s spletne strani:

  • Uporabite API spletnega mesta (če obstaja). Na primer, Facebook ima Facebook Graph API, ki omogoča pridobivanje podatkov, objavljenih na Facebooku.
  • Dostopajte do HTML-ja spletne strani in iz njega izvlecite koristne informacije/podatke. Ta tehnika se imenuje spletno strganje ali spletno zbiranje ali ekstrakcija spletnih podatkov.

Ta članek obravnava korake spletnega strganja z uporabo ogrodja spletnega strganja v Pythonu, imenovanega Beautiful Soup. Koraki pri spletnem strganju:



  1. Pošljite zahtevo HTTP na URL spletne strani, do katere želite dostopati. Strežnik se na zahtevo odzove tako, da vrne vsebino HTML spletne strani. Za to nalogo bomo uporabili knjižnico HTTP tretje osebe za zahteve python.
  2. Ko dostopamo do vsebine HTML, nam ostane še naloga razčlenitve podatkov. Ker je večina podatkov HTML ugnezdenih, podatkov ne moremo ekstrahirati preprosto z obdelavo nizov. Potrebujemo razčlenjevalnik, ki lahko ustvari ugnezdeno/drevesno strukturo podatkov HTML. Na voljo je veliko knjižnic razčlenjevalnika HTML, vendar je najnaprednejša html5lib.
  3. Vse, kar moramo storiti, je navigacija in iskanje po drevesu razčlenjevanja, ki smo ga ustvarili, tj. prečkanje drevesa. Za to nalogo bomo uporabili drugo knjižnico python, Lepa juha . Je knjižnica Python za črpanje podatkov iz datotek HTML in XML.

1. korak: Namestitev potrebnih knjižnic tretjih oseb

brisanje predpomnilnika npm
  • Najlažji način za namestitev zunanjih knjižnic v python je uporaba pip. pip je sistem za upravljanje paketov, ki se uporablja za namestitev in upravljanje programskih paketov, napisanih v Pythonu. Vse kar morate storiti je:
pip install requests pip install html5lib pip install bs4>

2. korak: dostop do vsebine HTML s spletne strani

Python








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

>

>

Poskusimo razumeti ta del kode.

  • Najprej uvozite knjižnico zahtev.
  • Nato določite URL spletne strani, ki jo želite postrgati.
  • Pošljite zahtevo HTTP na podani URL in shranite odgovor strežnika v odzivni objekt, imenovan r.
  • Zdaj, kot print r.content, da dobite surovo vsebino HTML spletne strani. Je vrste 'string'.

Opomba: včasih se lahko prikaže napaka Ni sprejeto, zato poskusite dodati uporabniškega agenta brskalnika, kot je spodaj. Tukaj poiščite svojega uporabniškega agenta glede na napravo in brskalnik 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)>

>

>

3. korak: Razčlenitev vsebine HTML

primerjaj z javo

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

logično v c

>

>

Resnično dobra stvar pri knjižnici BeautifulSoup je, da je zgrajena na vrhu knjižnic za razčlenjevanje HTML, kot so html5lib, lxml, html.parser itd. Objekt BeautifulSoup in določitev knjižnice razčlenjevalnika je torej mogoče ustvariti hkrati. V zgornjem primeru

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

Objekt BeautifulSoup ustvarimo tako, da posredujemo dva argumenta:

    r.content : Je neobdelana vsebina HTML. html5lib : Določitev razčlenjevalnika HTML, ki ga želimo uporabiti.

zdaj soup.prettify() je natisnjen, daje vizualno predstavitev drevesa razčlenjevanja, ustvarjenega iz neobdelane vsebine HTML. 4. korak: Iskanje in krmarjenje po drevesu razčlenjevanja Zdaj bi radi iz vsebine HTML izluščili nekaj uporabnih podatkov. Objekt soup vsebuje vse podatke v ugnezdeni strukturi, ki jih je mogoče programsko ekstrahirati. V našem primeru strgamo spletno stran, sestavljeno iz nekaj citatov. Zato bi radi ustvarili program za shranjevanje teh ponudb (in vseh ustreznih informacij o njih).

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

protokol udp

>

>

Preden nadaljujete, vam priporočamo, da pregledate vsebino HTML spletne strani, ki smo jo natisnili z metodo soup.prettify(), in poskusite najti vzorec ali način za navigacijo do narekovajev.

  • Opaziti je, da so vsi narekovaji znotraj vsebnika div, katerega ID je 'all_quotes'. Torej najdemo ta element div (imenovan kot tabela v zgornji kodi) z uporabo najti() metoda:
table = soup.find('div', attrs = {'id':'all_quotes'})>
  • Prvi argument je oznaka HTML, po kateri želite iskati, drugi argument pa je element tipa slovarja za podajanje dodatnih atributov, povezanih s to oznako. najti() metoda vrne prvi ujemajoči se element. Lahko poskusite natisniti table.prettify() da bi dobili občutek, kaj ta koda počne.
  • Zdaj lahko v elementu tabele opazite, da je vsak citat znotraj vsebnika div, katerega razred je citat. Torej ponavljamo skozi vsak vsebnik div, katerega razred je quote. Tu uporabljamo metodo findAll(), ki je po argumentih podobna metodi find, vendar vrne seznam vseh ujemajočih se elementov. Vsak citat se zdaj ponavlja z uporabo spremenljivke, imenovane vrstica. Tukaj je ena vzorčna vrstična vsebina HTML za boljše razumevanje: Zdaj pa razmislite o tem delu kode:
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)>
  • Ustvarimo slovar za shranjevanje vseh informacij o ponudbi. Do ugnezdene strukture lahko dostopate z zapisom s pikami. Za dostop do besedila znotraj elementa HTML uporabljamo .besedilo:
quote['theme'] = row.h5.text>
  • Dodamo, odstranimo, spremenimo in dostopamo do atributov oznake. To naredite tako, da oznako obravnavate kot slovar:
quote['url'] = row.a['href']>
  • Nazadnje so vsi citati pripeti k imenovanemu seznamu citati.
  • Nazadnje bi radi shranili vse svoje podatke v neko datoteko 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)>
  • Tukaj ustvarimo datoteko CSV z imenom inspirational_quotes.csv in shranimo vse citate v njej za nadaljnjo uporabo.

Torej, to je bil preprost primer, kako ustvariti spletno strgalo v Pythonu. Od tu lahko poskusite zavreči katero koli drugo spletno stran po vaši izbiri. V primeru kakršnih koli vprašanj jih objavite spodaj v razdelku za komentarje.

Opomba : Spletno strganje se v mnogih primerih šteje za nezakonito. Prav tako lahko povzroči, da spletno mesto trajno blokira vaš IP. Ta blog je prispeval Nikhil Kumar .