Opas HTML:n jäsentämiseen BeautifulSoupin avulla Pythonissa (2023)

Johdanto

Web scraping on ohjelmallisesti tietojen keräämistä eri verkkosivustoilta. Vaikka on olemassa monia eri kielillä olevia kirjastoja ja kehyksiä, jotka voivat poimia verkkotietoja, Python on pitkään ollut suosittu valinta, koska sillä on lukuisia vaihtoehtoja web-kaappaukseen.

Tämä artikkeli antaa sinulle pikakurssin verkkokaappauksesta PythonissaKaunis keitto- suosittu Python-kirjasto HTML:n ja XML:n jäsentämiseen.

Eettinen verkon kaapiminen

Web-kaappaus on kaikkialla ja antaa meille tietoja, joita saisimme API:lla. Hyvinä Internetin kansalaisina velvollisuutemme on kuitenkin kunnioittaa sivustojen omistajia, joista ryhdymme. Tässä on joitain periaatteita, joita verkkokaapijan tulee noudattaa:

  • Älä väitä kopioitua sisältöä omaksemme. Verkkosivustojen omistajat viettävät joskus pitkän ajan artikkeleiden luomiseen, tuotteiden tietojen keräämiseen tai muun sisällön keräämiseen. Meidän on kunnioitettava heidän työtänsä ja omaperäisyyttään.
  • Älä raaputa verkkosivustoa, joka ei halua raavittavan. Web-sivustoilla on joskus arobots.txttiedosto - joka määrittää verkkosivuston osat, jotka voidaan raaputtaa. Monilla verkkosivustoilla on myös käyttöehdot, jotka eivät välttämättä salli kaapimista. Meidän on kunnioitettava verkkosivustoja, jotka eivät halua tulla raavituksi.
  • Onko API jo saatavilla? Loistavaa, meidän ei tarvitse kirjoittaa kaavinta. API:t luodaan mahdollistamaan pääsyn tietoihin hallitulla tavalla tietojen omistajien määrittelemällä tavalla. Käytämme mieluummin sovellusliittymiä, jos niitä on saatavilla.
  • Pyyntöjen tekeminen verkkosivustolle voi heikentää verkkosivuston suorituskykyä. Liian monta pyyntöä tekevä verkkokaavin voi olla yhtä heikentävä kuin DDOS-hyökkäys. Meidän on raaputtava vastuullisesti, jotta emme aiheuta häiriöitä verkkosivuston normaalille toiminnalle.

Yleiskatsaus kauniiseen keittoon

Web-sivujen HTML-sisältöä voidaan jäsentää ja kaapia Beautiful Soup -sovelluksella. Seuraavassa osiossa käsittelemme toimintoja, jotka ovat hyödyllisiä verkkosivujen kaapimisessa.

Se, mikä tekee Beautiful Soupista niin hyödyllisen, ovat sen tarjoamat lukemattomat toiminnot tietojen poimimiseen HTML:stä. Tämä alla oleva kuva havainnollistaa joitain toimintoja, joita voimme käyttää:

Aloitetaan käytännönläheisyys ja katsotaan, kuinka voimme jäsentää HTML-koodia Beautiful Soup -sovelluksella. Harkitse seuraavaa HTML-sivua tallennettuna tiedostoon nimellädoc.html:

<html><pää> <otsikko>Pään titteliotsikko>pää><kehon> <s luokkaa="titteli"><b>Kehon otsikkob>s> <s luokkaa="tarina">rivi alkaa<a href="http://example.com/element1" luokkaa="elementti" id="linkki1">1a> <a href="http://example.com/element2" luokkaa="elementti" id="linkki2">2a> <a href="http://example.com/avatar1" luokkaa="hahmo" id="linkki3">3a> <s>rivi päättyys>kehon>html>

Seuraavat koodinpätkät on testattuUbuntu 20.04.1 LTS. Voit asentaaKaunis keittomoduuli kirjoittamalla terminaaliin seuraava komento:

$pip3 asenna beautifulsoup4

HTML-tiedostodoc.htmlon valmistauduttava. Tämä tehdään siirtämällä tiedosto osoitteeseenKaunis keittorakentaja, käytetään tähän interaktiivista Python-kuorta, jotta voimme tulostaa välittömästi tietyn sivun osan sisällön:

alkaenbs4tuontiKaunis keittokanssa avata("doc.html")kutenfp: keitto = Kauniskeitto(fp,"html.parser")

Nyt voimme käyttää Beautiful Soupia verkkosivustollamme liikkumiseen ja tietojen poimimiseen.

Navigoiminen tiettyihin tunnisteisiin

Haetaan edellisessä osiossa luodusta keittoobjektista otsikkotunnistedoc.html:

keitto.pää.nimi# palauttaa pään tittelin

Tässä on erittely jokaisesta komponentista, jota käytimme otsikon saamiseen:

Beautiful Soup on tehokas, koska Python-objektimme vastaavat kaavittavan HTML-dokumentin sisäkkäistä rakennetta.

Saadaksesi ensimmäisen tekstintag, kirjoita tämä:

soup.body.a.text# palauttaa arvon 1

Saadaksesi otsikon HTML:n body-tunnisteeseen (merkitty "title"-luokassa), kirjoita seuraava terminaaliin:

soup.body.p.b# palauttaa tekstin otsikon

Syvälle sisäkkäisissä HTML-dokumenteissa navigoinnista voi nopeasti tulla tylsää. Onneksi Beautiful Soupissa on hakutoiminto, joten meidän ei tarvitse navigoida hakeaksemme HTML-elementtejä.

Tunnisteiden elementtien etsiminen

Theetsi_kaikki()menetelmä ottaa HTML-tunnisteen merkkijonoargumenttina ja palauttaa luettelon elementeistä, jotka vastaavat annettua tagia. Esimerkiksi jos haluamme kaikenatunnisteet sisäändoc.html:

soup.find_all("a")

Katsotaan tämä luetteloatunnisteet tulosteena:

[1, 2, 3]

Tässä on erittely jokaisesta komponentista, jota käytimme tunnisteen etsimiseen:

Voimme etsiä myös tietyn luokan tunnisteita antamallaluokka_Perustelu. Kauniit keiton käyttötavatluokka_koskaluokkaaon Pythonissa varattu avainsana. Etsitään kaikkiatagit, joilla on "element"-luokka:

soup.find_all("a", luokka_="elementti")

Koska meillä on vain kaksi linkkiä "element"-luokkaan, näet tämän tulosteen:

[1, 2]

Entä jos haluaisimme hakea linkit, jotka on upotettu sisäänatunnisteet? Haetaan linkkihrefattribuuttia käyttämällälöytö()vaihtoehto. Se toimii aivan kutenetsi_kaikki()mutta se palauttaa ensimmäisen vastaavan elementin luettelon sijaan. Kirjoita tämä kuoreen:

soup.find("a", href=Totta)["href"]# palauttaa http://example.com/element1

Thelöytö()jaetsi_kaikki()funktiot hyväksyvät myös säännöllisen lausekkeen merkkijonon sijaan. Kulissien takana teksti suodatetaan käyttämällä koottuja säännöllisiä lausekkeitaHae()menetelmä. Esimerkiksi:

tuontirevartentagsisäänsoup.find_all(re.koota("^b")):Tulosta(tag)

Lista hakee iteroinnin yhteydessä tunnisteet merkistä alkaenbJohon sisältyyja:

Ilmainen e-kirja: Git Essentials

Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, joka sisältää parhaat käytännöt, alan hyväksymät standardit ja mukana tulevan huijauslomakkeen. Lopeta Git-komentojen googlailu ja oikeastaanoppiase!

 

Body-nimi

rivi alkaa 1 2 3

rivin loppu

Body's title< /b>

Olemme käsitelleet suosituimpia tapoja saada tunnisteita ja niiden ominaisuuksia. Joskus, erityisesti vähemmän dynaamisilla verkkosivuilla, haluamme vain tekstin sieltä. Katsotaan kuinka saamme sen!

Koko tekstin saaminen

Theget_text()toiminto hakee kaiken tekstin HTML-dokumentista. Otetaan koko HTML-dokumentin teksti:

soup.get_text()

Tulostuksesi pitäisi olla tällainen:

Pään otsikkoBodyn otsikkorivi alkaa 123 rivin loppua

Joskus rivinvaihtomerkit tulostetaan, joten tulos voi myös näyttää tältä:

"\n\nHead's title\n\n\nBody's title\nrivi alkaa\n 1\n2\n3\n rivi päättyy\n\n"

Nyt kun meillä on tunnetta kauniin keiton käyttöön, raavitaan nettisivut!

Kaunis keitto toiminnassa – kirjaluettelon kaapiminen

Nyt kun olemme oppineet Beautiful Soupin komponentit, on aika ottaa oppimme käyttöön. Rakennetaan kaavin tietojen poimimiseksihttps://books.toscrape.com/ja tallenna se CSV-tiedostoon. Sivusto sisältää satunnaista tietoa kirjoista, ja se on loistava tila testata verkkokaappaustekniikoitasi.

Luo ensin uusi tiedosto nimeltäscraper.py. Tuodaan kaikki tähän skriptiin tarvitsemamme kirjastot:

tuontipyynnöttuontiaikatuonticsvtuontirealkaenbs4tuontiKaunis keitto

Yllä mainituissa moduuleissa:

  • pyynnöt- suorittaa URL-pyynnön ja hakee verkkosivuston HTML-koodin
  • aika- rajoittaa kuinka monta kertaa sivua kaapataan kerralla
  • csv- auttaa meitä viemään kopioidut tiedot CSV-tiedostoon
  • re- antaa meille mahdollisuuden kirjoittaa säännöllisiä lausekkeita, jotka ovat hyödyllisiä poimittaessa tekstiä sen kuvion perusteella
  • bs4- Sinun vilpittömästi, kaavintamoduuli HTML-koodin jäsentämiseen

Olisitbs4jo asennettu jaaika,csv, jareovat Pythonin sisäänrakennettuja paketteja. Sinun on asennettavapyynnötmoduuli suoraan näin:

$pip3-asennuspyynnöt

Ennen kuin aloitat, sinun on ymmärrettävä, miten verkkosivun HTML-koodi on rakennettu. Siirrytään selaimessasi kohtaanhttp://books.toscrape.com/catalogue/page-1.html. Napsauta sitten hiiren kakkospainikkeella kaavittavan verkkosivun osia ja napsauta sittentarkastaa-painiketta ymmärtääksesi tunnisteiden hierarkian alla kuvatulla tavalla.

Tämä näyttää tarkastelemasi HTML-koodin. Seuraava kuva havainnollistaa näitä vaiheita:

Tarkastelemalla HTML-koodia opimme pääsemään käsiksi kirjan URL-osoitteeseen, kansikuvaan, otsikkoon, luokitukseen, hintaan ja muihin HTML-kenttiin. Kirjoitetaan funktio, joka kaapii kirjan ja poimii sen tiedot:

def raaputtaa(source_url, keitto): # Ottaa konkattien ohjaimen ja aliverkkotunnuksen parametreina # Etsi artikkelitunnisteen elementitkirjat = keitto.find_all("artikla", luokka_="product_pod")# Toista jokaisen kirjaartikkelin tunniste vartenjokainen_kirjasisäänkirjat: info_url = source_url+"/"+jokainen_kirja.h3.find("a")["href"] cover_url = source_url+"/luettelo"+ \ jokainen_kirja.a.img["src"].korvata("..","") otsikko = jokainen_kirja.h3.find("a")["titteli"] arvio = jokainen_kirja.find("p", luokka_="Tähtiluokitus")["luokka"][1]# voidaan kirjoittaa myös seuraavasti: every_book.h3.find("a").get("title")hinta = jokainen_kirja.find("p", luokka_="hinta_väri").text.strip().encode("ascii","jättää huomiotta").decode("ascii") saatavuus = jokainen_kirja.find("p", luokka_="varaston saatavuus").text.strip()# Kutsu write_to_csv-funktiowrite_to_csv([info_url, cover_url, title, luokitus, hinta, saatavuus])

Yllä olevan katkelman viimeinen rivi osoittaa funktioon, joka kirjoittaa kaavittujen merkkijonojen luettelon CSV-tiedostoon. Lisätään nyt se funktio:

def write_to_csv(list_input): # Kaavitut tiedot kirjoitetaan CSV-tiedostoon täällä. yrittää:kanssa avata("allBooks.csv","a")kutenfopen:# Avaa csv-tiedosto.csv_writer = csv.writer(fopen) csv_writer.writerow(list_input)paitsi:palata Väärä

Koska meillä on toiminto, joka voi kaapata sivun ja viedä sen CSV-muotoon, haluamme toisen toiminnon, joka indeksoi sivutetun verkkosivuston ja kerää kirjatietoja jokaiselta sivulta.

Tätä varten katsotaan URL-osoitetta, jolle kirjoitamme tämän kaavin:

"http://books.toscrape.com/catalogue/page-1.html"

Ainoa URL-osoitteen muuttuva elementti on sivunumero. Voimme muotoilla URL-osoitteen dynaamisesti niin, että siitä tulee asiemen-URL:

"http://books.toscrape.com/catalogue/page-{}.html".muoto(str(sivunumero))

Tämä merkkijonomuotoiltu URL-osoite sivunumerolla voidaan noutaa menetelmällärequests.get(). Voimme sitten luoda uudenKaunis keittoesine. Joka kerta kun saamme keittoobjektin, "seuraava"-painikkeen läsnäolo tarkistetaan, jotta voimme pysähtyä viimeiselle sivulle. Pidämme kirjaa sivunumeron laskuria, joka kasvaa yhdellä, kun sivu on kaapinut onnistuneesti.

def selaa_ja_raaputa(siemen_url, sivun_numero=1): # Hae URL-osoite - Käytämme tätä kuvien ja tietoreittien liittämiseenurl_pat = re.koota(r"(http://.*\.com)") source_url = url_pat.search(seed_url).group(0)# Argumentin sivunumero muotoillaan URL-osoitteessa ja haetaanformatted_url = siemen_url.muoto(str(sivunumero))yrittää: html_text = requests.get(formatted_url).text# Valmista keittokeitto = BeautifulSoup(html_text,"html.parser")Tulosta(f"Now Scraping -{formatted_url}")# Tämä if-lause pysäyttää skriptin, kun se osuu tyhjälle sivulle jossoup.find("li", luokka_="Seuraava") !=Ei mitään: scrape(lähde_url, keitto)# Käynnistä kaavintoiminto # Ole vastuullinen kansalainen odottamalla ennen kuin osut uudelleentime.sleep(3) sivun_numero +=1 # Kutsu rekursiivisesti sama funktio inkrementilläbrowse_and_crape(seed_url, page_number)muu: scrape(lähde_url, keitto)# Skripti poistuu tästä palata Totta palata Totta paitsiPoikkeuskutene:palatae

Yllä oleva toiminto,browse_and_scrape(), kutsutaan rekursiivisesti funktioon astisoup.find("li",luokka_="seuraava")palaaEi mitään. Tässä vaiheessa koodi kaapii verkkosivun jäljellä olevan osan ja poistuu.

Palapelin viimeistä palaa varten aloitamme kaapimisen. Me määrittelemmesiemen_urlja soitabrowse_and_scrape()saadakseen tiedot. Tämä tehdään allajos __nimi__ == "__main__"lohko:

jos__nimi__ =="__main__": siemen_url ="http://books.toscrape.com/catalogue/page-{}.html" Tulosta("Verkon kaapiminen on alkanut") tulos = browse_and_crape(seed_url)jostulos ==Totta:Tulosta("Verkon kaapiminen on nyt valmis!")muu:Tulosta(f"Hups, tuo ei näytä oikealta!!!{tulos}")

Jos haluat oppia lisääjos __nimi__ == "__main__"lohko, tutustu oppaaseemmekuinka se toimii.

Voit suorittaa komentosarjan päätteessäsi alla kuvatulla tavalla ja saada tulos seuraavasti:

$python scraper.py
Web-kaappaus on alkanutNow Scraping - http://books.toscrape.com/catalogue/page-1.htmlNow Scraping - http://books.toscrape.com/catalogue/page-2.htmlNow Scraping - http://books. toscrape.com/catalogue/page-3.html...Now Scraping - http://books.toscrape.com/catalogue/page-49.htmlNow Scraping - http://books.toscrape.com/catalogue/page- 50.htmlWeb-kaappaus on nyt valmis!

Kaavitut tiedot löytyvät nykyisestä työhakemistosta tiedostonimen altaallBooks.csv. Tässä on esimerkki tiedoston sisällöstä:

http://books.toscrape.com/a-light-in-the-attic_1000/index.html,http://books.toscrape.com/catalogue/media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg,A Light in the Attic,Three,51.77,Varastossahttp://books.toscrape.com/tipping-the-velvet_999/index.html,http://books.toscrape.com/catalogue/media/cache/26/0c/260c6ae16bce31c8f8c9f4dad .jpg,Tipping the Velvet,One,53.74,Varastossahttp://books.toscrape.com/soumission_998/index.html,http://books.toscrape.com/catalogue/media/cache/3e/ef/3eef99c9d9adef34639f522066020 jpg,Soumission,Yksi,50.10,Varastossa

Hyvää työtä! Jos haluat katsoa kaavinkoodia kokonaisuudessaan, löydät sen osoitteestaGitHub.

Johtopäätös

Tässä opetusohjelmassa opimme hyvien verkkokaapimien kirjoittamisen etiikkaa. Sitten käytimme Beautiful Soupia poimimaan tietoja HTML-tiedostosta kauniin keiton objektiominaisuuksien avulla, ja se on eri menetelmiä, kutenlöytö(),etsi_kaikki()jaget_text(). Rakensimme sitten kaavin, joka hakee kirjaluettelon verkosta ja vie sen CSV-muotoon.

Web-kaappaus on hyödyllinen taito, joka auttaa erilaisissa toimissa, kuten tietojen, kuten API:n, poimimisessa, verkkosivuston laadunvarmistuksen suorittamisessa, verkkosivuston toimimattomien URL-osoitteiden tarkistamisessa ja paljon muuta. Mikä on seuraava kaavin, jonka aiot rakentaa?

References

Top Articles
Latest Posts
Article information

Author: Twana Towne Ret

Last Updated: 12/07/2023

Views: 6564

Rating: 4.3 / 5 (44 voted)

Reviews: 83% of readers found this page helpful

Author information

Name: Twana Towne Ret

Birthday: 1994-03-19

Address: Apt. 990 97439 Corwin Motorway, Port Eliseoburgh, NM 99144-2618

Phone: +5958753152963

Job: National Specialist

Hobby: Kayaking, Photography, Skydiving, Embroidery, Leather crafting, Orienteering, Cooking

Introduction: My name is Twana Towne Ret, I am a famous, talented, joyous, perfect, powerful, inquisitive, lovely person who loves writing and wants to share my knowledge and understanding with you.