Struganje

Web struganje s Python modulom za struganje

Web struganje s Python modulom za struganje
Vještina struganja s weba danas je postala zlatna, pa naučimo kako možemo dobiti potrebne podatke s web stranica. U ovom bismo članku govorili o biblioteci Scrapy Python, o tome što ona može učiniti i kako je koristiti. Započnimo.

Zašto Scrapy?

Scrapy je robusna biblioteka za struganje na webu koja pruža mogućnost preuzimanja web stranica, slika i svih podataka kojih biste se mogli sjetiti brzinom munje. Brzina je od velike važnosti u računanju, a Scrapy na tome djeluje tako da asinkrono posjećuje web stranice i radi puno pozadinskih poslova čineći da cijeli zadatak izgleda lako.

Treba reći da Python ima i druge knjižnice koje se mogu koristiti za struganje podataka s web stranica, ali nijedna nije usporediva sa Scrapy kada je u pitanju učinkovitost.

Montaža

Kratko ćemo pogledati kako se ova moćna knjižnica može instalirati na vaš stroj.

Kao i kod većine Python biblioteka, i Scrapy možete instalirati pomoću pip modula:

pip instalirati Scrapy

Možete li provjeriti je li instalacija bila uspješna uvozom škrapije u Pythonovu interaktivnu ljusku.

$ python
Python 3.5.2 (zadano, 14. rujna 2017., 22:51:06)
[OUU 5.4.0 20160609] na Linuxu

Upišite "pomoć", "autorska prava", "krediti" ili "licenca" za više informacija.

>>> uvozna struga

Sad kad smo završili s instalacijom, krenimo u stvar.

Izrada projekta za struganje weba

Tijekom instalacije, ključna riječ scrapy dodana je na put tako da je možemo koristiti izravno iz naredbenog retka. Iskoristili bismo to tijekom cijelog korištenja knjižnice.

Iz direktorija po vašem izboru pokrenite sljedeću naredbu:

scrapy startproject webscraper

Ovo bi stvorilo direktorij pod nazivom webscraper u trenutnom direktoriju i škrapiji.cfg datoteku. U webscraper  imenik bi imao __u tome__.py, predmeti.py, srednji proizvodi.py, cjevovodi.py, postavke.py datoteke i direktorij zvan pauci.

Naše datoteke pauka i.e. skripta koja radi webscraping za nas bila bi pohranjena u pauci imenik.

Pisanje našeg pauka

Prije nego što nastavimo s pisanjem našeg pauka, očekuje se da već znamo koje web mjesto želimo strugati. U svrhu ovog članka stružemo uzorkom web stranice za web oblikovanje: http: // primjer.webscraping.com.

Ova web stranica samo sadrži nazive država i njihove zastave, s različitim stranicama, a mi ćemo ukinuti tri stranice. Tri stranice na kojima bismo radili su:

http: // primjer.webscraping.com / places / default / index / 0
http: // primjer.webscraping.com / places / default / index / 1
http: // primjer.webscraping.com / places / default / index / 2

Natrag na našeg pauka, stvorit ćemo sample_spider.py u direktoriju pauka. S terminala, jednostavno dodirnite sample_spider.py naredba bi pomogla stvoriti novu datoteku.

Nakon stvaranja datoteke, popunili bismo je sljedećim retcima koda:

uvozna škrapija
 
razred SampleSpider (scrap.Pauk):
name = "uzorak"
početni_urlovi = [
"http: // primjer.webscraping.com / places / default / index / 0 ",
"http: // primjer.webscraping.com / places / default / index / 1 ",
"http: // primjer.webscraping.com / places / default / index / 2 "
]
 
def raščlanjivanje (self, odgovor):
page_number = odgovor.url.podijeliti ('/') [- 1]
file_name = "stranica .html ".format (broj_strane)
s otvorenim (ime_datoteke, 'wb') kao datotekom:
datoteka.napisati (odgovor.tijelo)

Na gornjoj razini direktorija projekta pokrenite sljedeću naredbu:

scrap puzati uzorak

Sjetimo se da smo dali svoje SampleSpider razred a Ime atribut uzorak.

Nakon pokretanja te naredbe primijetili biste da postoje tri datoteke s imenom page0.html, stranica1.html, stranica2.html spremaju se u direktorij.

Pogledajmo što se događa s kodom:

uvozna škrapija

Prvo uvezimo knjižnicu u naš prostor imena.

razred SampleSpider (scrap.Pauk):
name = "uzorak"

Tada stvaramo klasu pauka koju nazivamo SampleSpider. Naš pauk nasljeđuje od struganje.Pauk. Svi naši pauci moraju naslijediti od otpada.Pauk. Nakon stvaranja klase, našem pauku dajemo a Ime atribut, ovo Ime atribut koristi se za pozivanje pauka s terminala. Ako se sjećate, pokrenuli smo scrap puzati uzorak naredba za pokretanje našeg koda.

početni_urlovi = [
 
"http: // primjer.webscraping.com / places / default / index / 0 ",
"http: // primjer.webscraping.com / places / default / index / 1 ",
"http: // primjer.webscraping.com / places / default / index / 2 "
]

Imamo i popis URL-ova koje pauk treba posjetiti. Popis se mora pozvati početni_urlovi. Ako popisu želite dati drugo ime, morali bismo definirati a zahtjevi za početak funkcija koja nam daje još neke mogućnosti. Da biste saznali više, možete pogledati dokumentaciju o scrapingu.

Bez obzira na to, ne zaboravite uključiti http: // ili https: // za svoje veze inače biste se morali nositi s pogreškom sheme koja nedostaje.

def raščlanjivanje (self, odgovor):

Zatim nastavljamo s deklariranjem funkcije raščlanjivanja i davanjem parametra odgovora. Kada se kôd izvrši, aktivira se funkcija raščlanjivanja i šalje se objekt odgovora u kojem se nalaze svi podaci o posjećenoj web stranici.

page_number = odgovor.url.podijeliti ('/') [- 1]
file_name = "stranica .html ".format (broj_strane)

Što smo učinili s ovim kodom, podijelili smo niz koji sadrži adresu i samo broj stranice spremili u broj stranice varijabilna. Tada kreiramo naziv datoteke umetanje varijable broj stranice u nizu koji bi bio naziv datoteke koju bismo stvarali.

s otvorenim (ime_datoteke, 'wb') kao datotekom:
datoteka.napisati (odgovor.tijelo)

Sada smo stvorili datoteku i sadržaj web stranice zapisujemo u datoteku pomoću datoteke tijelo atribut odgovor objekt.

Možemo učiniti više od samog spremanja web stranice. Biblioteka BeautifulSoup može se koristiti za raščlanjivanje datoteke tijelo.odgovor. Ovaj tutorial BeautiulSoupa možete pogledati ako niste upoznati s knjižnicom.

Sa stranice koja se uklanja, evo izvatka html-a koji sadrži podatke koji su nam potrebni:

Primijetili biste da su svi potrebni podaci zatvoreni u div oznakama, pa ćemo prepisati kod za raščlanjivanje html-a.
Evo naše nove skripte:

uvozna škrapija
iz bs4 uvoza BeautifulSoup
 
razred SampleSpider (scrap.Pauk):
name = "uzorak"
 
početni_urlovi = [
"http: // primjer.webscraping.com / places / default / index / 0 ",
"http: // primjer.webscraping.com / places / default / index / 1 ",
"http: // primjer.webscraping.com / places / default / index / 2 "
]
 
def raščlanjivanje (samo, odgovor):
page_number = odgovor.url.podijeliti ('/') [- 1]
file_name = "stranica .txt ".format (broj_strane)
s otvorenim (ime_datoteke, 'w') kao datoteka:
html_content = BeautifulSoup (odgovor.tijelo, "lxml")
div_tags = html_content.pronađi ("div", "id": "rezultati")
country_tags = div_tags.find_all ("div")
country_name_position = zip (raspon (len (country_tags)), country_tags)
za poziciju, ime_zemlje u položaju_ime_zemlje:
datoteka.write ("broj države : \ n".format (pozicija + 1, ime_zemlje.tekst))

Kôd je gotovo isti kao početni, međutim, dodao sam BeautifulSoup u naš prostor imena i promijenio logiku u funkciji raščlanjivanja.

Pogledajmo na brzinu logiku.

def raščlanjivanje (samo, odgovor):

Ovdje smo definirali funkciju raščlanjivanja i dali smo joj parametar odgovora.

page_number = odgovor.url.podijeliti ('/') [- 1]
file_name = "stranica .txt ".format (broj_strane)
s otvorenim (ime_datoteke, 'w') kao datoteka:

Ovo čini istu stvar kao što je raspravljeno u početnom kodu, jedina je razlika što radimo s tekstualnom datotekom umjesto s html datotekom. Spremili bismo izgrebane podatke u tekstualnu datoteku, a ne cijeli web sadržaj u html kao što je prethodno učinjeno.

html_content = BeautifulSoup (odgovor.tijelo, "lxml")

U ovom retku koda učinili smo da pošaljemo datoteku odgovor.tijelo kao argument za knjižnicu BeautifulSoup, a rezultate dodijelio html_content varijabilna.

div_tags = html_content.pronađi ("div", "id": "rezultati")

Uzimajući html sadržaj, ovdje ga raščlanjujemo tražeći div oznaka koja također ima i iskaznica atribut sa rezultatima jer je vrijednost, tada je možemo spremiti u div_tags varijabilna.

country_tags = div_tags.find_all ("div")

Zapamtite da su zemlje postojale u div oznake, sada jednostavno dobivamo sve div oznake i sprema ih kao popis u oznake_zemlja varijabilna.

country_name_position = zip (raspon (len (country_tags)), country_tags)
 
za poziciju, ime_zemlje u položaju_ime_zemlje:
datoteka.write ("broj države : \ n".format (pozicija + 1, ime_zemlje.tekst))

Ovdje izvršavamo ponavljanje položaja država među svim oznakama zemalja, a zatim spremamo sadržaj u tekstualnu datoteku.

Tako biste u svojoj tekstualnoj datoteci imali nešto poput:

zemlja broj 1: Afganistan
država broj 2: Alandski otoci
zemlja broj 3: Albanija
..

Zaključak

Scrapy je nesumnjivo jedna od najmoćnijih knjižnica vani, vrlo je brza i u osnovi preuzima web stranicu. Tada vam daje slobodu što god želite s web sadržajem.

Moramo napomenuti da Scrapy može učiniti mnogo više nego što smo ovdje provjerili. Ako želite, možete raščlaniti podatke pomoću selektora Scrapy CSS ili Xpath. Dokumentaciju možete pročitati ako trebate poduzeti nešto složenije.

Najbolje igre naredbenog retka za Linux
Naredbeni redak nije samo vaš najveći saveznik pri korištenju Linuxa - on također može biti izvor zabave jer ga možete koristiti za igranje mnogih zab...
Najbolje aplikacije za mapiranje gamepada za Linux
Ako volite igrati igre na Linuxu s gamepadom umjesto tipičnim sustavom za unos tipkovnice i miša, za vas postoji nekoliko korisnih aplikacija. Mnoge r...
Korisni alati za Linux igrače
Ako volite igrati igre na Linuxu, velika je vjerojatnost da ste možda koristili aplikacije i uslužne programe poput Wine, Lutris i OBS Studio za pobol...