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 a
robots.txt
tiedosto - 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 keitto
moduuli kirjoittamalla terminaaliin seuraava komento:
$pip3 asenna beautifulsoup4
HTML-tiedostodoc.html
on valmistauduttava. Tämä tehdään siirtämällä tiedosto osoitteeseenKaunis keitto
rakentaja, 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 kaikena
tunnisteet sisäändoc.html
:
soup.find_all("a")
Katsotaan tämä luetteloa
tunnisteet 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_
koskaluokkaa
on Pythonissa varattu avainsana. Etsitään kaikkia
tagit, 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ääna
tunnisteet? Haetaan linkkihref
attribuuttia 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ä alkaenb
Johon 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
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-koodinaika
- rajoittaa kuinka monta kertaa sivua kaapataan kerrallacsv
- auttaa meitä viemään kopioidut tiedot CSV-tiedostoonre
- antaa meille mahdollisuuden kirjoittaa säännöllisiä lausekkeita, jotka ovat hyödyllisiä poimittaessa tekstiä sen kuvion perusteellabs4
- Sinun vilpittömästi, kaavintamoduuli HTML-koodin jäsentämiseen
Olisitbs4
jo asennettu jaaika
,csv
, jare
ovat Pythonin sisäänrakennettuja paketteja. Sinun on asennettavapyynnöt
moduuli 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 keitto
esine. 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_url
ja 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?