Žiniatinklio rinkimas yra vienas geriausių duomenų rinkimo metodų, leidžiančių rinkti duomenis ir kurti pasirinktinius duomenų rinkinius.
Šioje duomenimis pagrįsto sprendimų priėmimo eroje labai svarbu turėti aukštos kokybės duomenų rinkinius. Nors yra daug viešai prieinamų duomenų rinkinių, kartais gali tekti sukurti tinkintus duomenų rinkinius, kurie atitiktų jūsų konkrečius poreikius. Žiniatinklio rinkimas leidžia išgauti duomenis iš svetainių. Tada galite naudoti šiuos duomenis kurdami tinkintą duomenų rinkinį.
Duomenų rinkimo metodų apžvalga
Yra įvairių duomenų rinkimo būdų. Tai apima rankinį duomenų įvedimą, API, viešuosius duomenų rinkinius ir žiniatinklio rinkimą. Kiekvienas metodas turi savo privalumų ir apribojimų.
Duomenų įvedimas rankiniu būdu užima daug laiko ir gali padaryti žmogiškųjų klaidų, ypač renkant didelio masto duomenis. Tačiau tai naudinga renkant nedidelio masto duomenis ir kai duomenys nepasiekiami kitomis priemonėmis.
API leidžia kūrėjams struktūriškai pasiekti ir gauti duomenis. Jie dažnai teikia informaciją realiuoju laiku arba reguliariai atnaujinamą. Tačiau API prieiga gali būti apribota, reikalinga autentifikacija arba gali būti taikomi naudojimo apribojimai.
Viešieji duomenų rinkiniai apima daugybę temų ir sričių. Jie yra iš anksto surinkti ir dažnai pateikiami struktūrizuotu formatu, todėl juos lengva pasiekti. Jie gali sutaupyti laiko ir pastangų, kai reikalingi duomenys sutampa su turimais duomenų rinkiniais. Tačiau jie ne visada gali patenkinti jūsų konkrečius poreikius arba būti naujausi.
Žiniatinklio rinkimas suteikia galimybę rinkti duomenis iš svetainių, kurios nesiūlo API arba turi ribotą prieigą. Tai leidžia pritaikyti, keisti mastelį ir rinkti duomenis iš kelių šaltinių. Tačiau tam reikalingi programavimo įgūdžiai, HTML struktūros išmanymas ir teisinių bei etinių gairių laikymasis.
Duomenų rinkimo žiniatinklio rinkimo pasirinkimas
Žiniatinklio rinkimas leidžia išgauti informaciją tiesiai iš tinklalapių, todėl galite pasiekti daugybę duomenų šaltinių. Taip pat galite valdyti, kokius duomenis išgauti ir kaip juos struktūrizuoti. Tai leidžia lengvai pritaikyti grandymo procesą, kad jis atitiktų jūsų konkrečius reikalavimus, ir išgauti tikslią informaciją, kurios jums reikia jūsų projektui.
Duomenų šaltinio identifikavimas
Pirmasis žiniatinklio rinkimo žingsnis yra duomenų šaltinio nustatymas. Tai svetainė, kurioje yra duomenys, kuriuos norite nuskaityti. Rinkdamiesi duomenų šaltinį įsitikinkite, kad atitinkate šaltinio paslaugų teikimo sąlygas. Šiame straipsnyje kaip duomenų šaltinis bus naudojama IMDb (Internet Movie Database).
Aplinkos nustatymas
Sukurkite virtualią aplinką. Tada paleiskite šią komandą, kad įdiegtumėte reikiamas bibliotekas.
pip diegimo užklausos beautifulsoup4 pandos
Jūs naudosite prašymus biblioteka HTTP užklausoms pateikti. graži sriuba 4 analizuoti HTML turinį ir išgauti duomenis iš tinklalapių. Galiausiai naudositės pandos manipuliuoti ir analizuoti duomenis.
Visą šaltinio kodą rasite a GitHub saugykla.
Žiniatinklio iškarpymo scenarijaus rašymas
Importuokite įdiegtas bibliotekas į savo scenarijų, kad galėtumėte naudotis jų teikiamomis funkcijomis.
importuoti prašymus
iš bs4 importuoti Graži sriuba
importuoti laikas
importuoti pandos kaip pd
importuoti re
The laikas ir re moduliai yra standartinės Python bibliotekos dalis. Todėl nereikia atskirų įrengimų.
laikas o tai padidins grandymo procesą re susitvarkys reguliarios išraiškos.
Tu darysi naudokite Gražią sriubą, kad nubrėžtumėte tikslinę svetainę.
Sukurkite funkciją, kuri išsiųs HTTP GET užklausą į jūsų tikslinį URL. Tada jis turėtų gauti atsakymo turinį ir sukurti a Graži sriuba objektą iš HTML turinio.
defgauti_sriubą(url, params = Nėra, headers = Nėra):
atsakymas = requests.get (url, params=params, headers=headers)
sriuba = BeautifulSoup (response.content, "html.parser")
grąžinti sriuba
Kitas žingsnis yra išgauti informaciją iš Graži sriuba objektas.
Norėdami išgauti informaciją, turite suprasti tikslinės svetainės struktūrą. Tai apima svetainės HTML kodo patikrinimą. Tai padės nustatyti elementus ir atributus, kuriuose yra norimų išgauti duomenų. Norėdami patikrinti tikslinę svetainę, atidarykite jos nuorodą žiniatinklio naršyklėje ir eikite į tinklalapį, kuriame yra norimi nuskaityti duomenys.
Tada dešiniuoju pelės mygtuku spustelėkite tinklalapį ir pasirinkite Apžiūrėti iš kontekstinio meniu. Tai atvers naršyklės kūrėjo įrankius.
Tinklalapio HTML kode ieškokite elementų, kuriuose yra norimų nuskaityti duomenų. Atkreipkite dėmesį į HTML žymas, klases ir atributus, susietus su reikalingais duomenimis. Jas naudosite kurdami parinkiklius duomenims išgauti naudodami „BeautifulSoup“. Viršuje esančioje ekrano kopijoje matote, kad filmo pavadinimas yra viduje lister-element-header klasė. Patikrinkite kiekvieną norimą išskirti funkciją.
Sukurkite funkciją, kuri ištrauks informaciją iš Graži sriuba objektas. Šiuo atveju funkcija suranda filmo pavadinimą, įvertinimą, aprašymą, žanrą, išleidimo datą, režisierius ir žvaigždes, naudodama atitinkamas HTML žymas ir klasės atributus.
defekstrakto_filmo_duomenys(filmas):
pavadinimas = movie.find("h3", klasė_="lister-item-header").rasti("a").tekstas
įvertinimas = movie.find("div", klasė_="reitingai-imdb-rating").stiprus.tekstas
aprašymas = movie.find("div", klasė_="sąrašo elemento turinys").rasti_viską("p")[1].text.strip()
žanro_elementas = movie.find("span", klasė_="žanras")
žanras = žanro_elementas.text.strip() jeigu žanro_elementas KitasNė vienas
release_date = movie.find("span", klasė_="lister-item-year text-muted unbold").text.strip()
režisierius_žvaigždės = filmas.rasti("p", klasė_=„tekstas nutildytas“).rasti_viską("a")
direktoriai = [asmuo.tekstas dėl asmuo in režisierius_žvaigždės[:-1]]
žvaigždės = [asmuo.tekstas dėl asmuo in režisierius_žvaigždės[-1:]]
filmo_duomenys = {
"Pavadinimas": pavadinimas,
"Įvertinimas": įvertinimas,
"Apibūdinimas": apibūdinimas,
"Žanras": žanras,
"Išleidimo data": Išleidimo data,
"Direktoriai": režisieriai,
"Žvaigždės": žvaigždės
}
grąžinti filmo_duomenys
Galiausiai sukurkite funkciją, kuri atliks faktinį grandymą, naudodama pirmiau minėtas dvi funkcijas. Prireiks metų ir maksimalaus filmų skaičiaus, kurį norite nubraukti.
defscrape_imdb_movies(metai, limitas):
bazinis_url = " https://www.imdb.com/search/title"
antraštės = {„Priimti – kalba“: "en-US, en; q = 0,9 colio}
filmai = []
pradžia = 1
kol len (filmai) < limitas:
params = {
"Išleidimo data": metai,
"rūšiuoti": "balsų_skaičius, desc",
"pradėti": pradžia
}
sriuba = get_soup (base_url, params = params, headers = antraštės)
movie_list = sriuba.find_all("div", klasė_=„išplėstinis sąrašo elemento režimas“)
jeigu len (movie_list) == 0:
pertrauka
dėl filmas in movie_list:
movie_data = ekstrakto_movie_duomenys (filmas)
movies.append (movie_data)
jeigu len (filmai) >= limitas:
pertrauka
pradžia += 50# IMDb puslapyje rodoma 50 filmų
time.sleep(1) # Pridėkite delsą, kad neapkrautumėte serverio
grąžinti filmai
Tada skambinkite def scrape_imdb_movies daryti grandymą.
# „Scrape 1000“ filmų, išleistų 2023 m. (arba tiek, kiek yra)
filmai = scrape_imdb_movies(2023, 1000)
Dabar iškraipėte duomenis.
Kitas žingsnis – iš šių duomenų sukurti duomenų rinkinį.
Duomenų rinkinio sukūrimas iš nuskaitytų duomenų
Sukurkite duomenų rėmelį naudodami Pandas iš nubrauktų duomenų.
df = pd. DataFrame (filmai)
Tada atlikite išankstinį duomenų apdorojimą ir valymą. Tokiu atveju pašalinkite eilutes su trūkstamomis reikšmėmis. Tada iš išleidimo datos ištraukite metus ir konvertuokite į skaitinius. Pašalinkite nereikalingus stulpelius. Konvertuoti Įvertinimas stulpelio į skaičių. Galiausiai pašalinkite neabėcėlės simbolius iš Pavadinimas stulpelyje.
df = df.dropna()
df[„Išleidimo metai“] = df['Išleidimo data'].str.extract(r'(\d{4})')
df[„Išleidimo metai“] = pd.to_numeric (df[„Išleidimo metai“],
klaidos ='prievarta'.astype("Int64")
df = df.drop(['Išleidimo data'], ašis=1)
df['Įvertinimas'] = pd.to_numeric (df['Įvertinimas'], klaidos='prievarta')
df["Pavadinimas"] = df["Pavadinimas"].apply(lambda x: re.sub(r'\W+', ' ', x))
Išsaugokite duomenis faile, kad vėliau galėtumėte naudoti savo projekte.
df.to_csv("imdb_movies_dataset.csv", indeksas=Netiesa)
Galiausiai išspausdinkite pirmąsias penkias duomenų rinkinio eilutes, kad pamatytumėte, kaip jis atrodo.
df.head()
Išvestis yra tokia, kaip parodyta toliau pateiktoje ekrano kopijoje:
Dabar turite duomenų rinkinį, gautą naudojant žiniatinklio grandymą.
Žiniatinklio rinkimas naudojant kitas Python bibliotekas
Graži sriuba nėra vienintelė Python biblioteka, kurią galite naudoti žiniatinklyje. Yra ir kitų bibliotekų. Kiekvienas su savo privalumais ir apribojimais. Ištirkite juos, kad sužinotumėte, kuris iš jų geriausiai tinka jūsų naudojimo atvejui.