Kako izraditi alat za indeksiranje URL-ova za mapiranje web mjesta pomoću Pythona

Jednostavan projekt za učenje osnova struganja weba

Prije nego što započnemo, pobrinimo se da razumijemo što je struganje weba:

Web struganje je postupak izdvajanja podataka s web stranica kako bi se oni predstavili u formatu koji korisnici mogu lako razumjeti.

U ovom uputstvu želim pokazati koliko je jednostavno u Pythonu izraditi jednostavan alat za indeksiranje URL-a koji možete koristiti za mapiranje web stranica. Iako je ovaj program relativno jednostavan, može pružiti sjajan uvod u osnove struganja i automatizacije weba. Usredotočit ćemo se na rekurzivno izdvajanje veza s web stranica, ali iste ideje mogu se primijeniti na bezbroj drugih rješenja.

Naš program će raditi ovako:

  1. Posjetite web stranicu
  2. Ostružite sve jedinstvene URL-ove pronađene na web stranici i dodajte ih u red čekanja
  3. Rekurzivno obrađujte URL-ove jedan po jedan dok ne iscrpimo red
  4. Ispis rezultata

Prvo najprije

Prvo što bismo trebali učiniti je uvesti sve potrebne knjižnice. Za struganje na webu koristit ćemo BeautifulSoup, zahtjeve i urllib.

from bs4 import BeautifulSoupimport requestsimport requests.exceptionsfrom urllib.parse import urlsplitfrom urllib.parse import urlparsefrom collections import deque

Dalje, moramo odabrati URL s kojeg ćemo početi indeksirati. Iako možete odabrati bilo koju web stranicu s HTML vezama, preporučujem upotrebu ScrapeThisSite. To je siguran pješčanik kojim možete puzati bez upada u nevolje.

url = “//scrapethissite.com”

Dalje, trebat ćemo stvoriti novi deque objekt tako da možemo lako dodati novo pronađene poveznice i ukloniti ih kad završimo s njihovom obradom. Unaprijed popunite deque vašom urlvarijablom:

# a queue of urls to be crawled nextnew_urls = deque([url])

Zatim možemo koristiti set za pohranu jedinstvenih URL-ova nakon što su obrađeni:

# a set of urls that we have already processed processed_urls = set()

Također želimo pratiti lokalne (ista domena kao ciljna), strane (druga domena kao ciljna) i neispravne URL adrese:

# a set of domains inside the target websitelocal_urls = set()
# a set of domains outside the target websiteforeign_urls = set()
# a set of broken urlsbroken_urls = set()

Vrijeme za puzanje

Uz sve to na mjestu, sada možemo početi pisati stvarni kôd za indeksiranje web stranice.

Želimo pogledati svaki URL u redu, provjeriti postoje li dodatni URL-ovi na toj stranici i dodati svaki na kraj reda dok ih više nema. Čim završimo s struganjem URL-a, uklonit ćemo ga iz reda i dodati u processed_urlsset za kasniju upotrebu.

# process urls one by one until we exhaust the queuewhile len(new_urls): # move url from the queue to processed url set url = new_urls.popleft() processed_urls.add(url) # print the current url print(“Processing %s” % url)

Zatim dodajte izuzetak za hvatanje pokvarenih web stranica i dodajte ih u broken_urlsset za kasniju upotrebu:

try: response = requests.get(url)
except(requests.exceptions.MissingSchema, requests.exceptions.ConnectionError, requests.exceptions.InvalidURL, requests.exceptions.InvalidSchema): # add broken urls to it’s own set, then continue broken_urls.add(url) continue

Zatim moramo dobiti osnovni URL web stranice kako bismo mogli lako razlikovati lokalne i strane adrese:

# extract base url to resolve relative linksparts = urlsplit(url)base = “{0.netloc}”.format(parts)strip_base = base.replace(“www.”, “”)base_url = “{0.scheme}://{0.netloc}”.format(parts)path = url[:url.rfind(‘/’)+1] if ‘/’ in parts.path else url

Inicijalizirajte BeautifulSoup za obradu HTML dokumenta:

soup = BeautifulSoup(response.text, “lxml”)

Sada stružite web stranicu za sve poveznice i sortirajte ih dodajte u njihov odgovarajući skup:

for link in soup.find_all(‘a’): # extract link url from the anchor anchor = link.attrs[“href”] if “href” in link.attrs else ‘’
if anchor.startswith(‘/’): local_link = base_url + anchor local_urls.add(local_link) elif strip_base in anchor: local_urls.add(anchor) elif not anchor.startswith(‘http’): local_link = path + anchor local_urls.add(local_link) else: foreign_urls.add(anchor)

Budući da svoj alat za indeksiranje želim ograničiti samo na lokalne adrese, dodajem sljedeće kako bih u naš red dodao nove URL-ove:

for i in local_urls: if not i in new_urls and not i in processed_urls: new_urls.append(i)

Ako želite indeksirati sve URL-ove, upotrijebite:

if not link in new_urls and not link in processed_urls: new_urls.append(link)

Upozorenje: Način na koji program trenutno radi, indeksiranje stranih URL-ova trajat će VRLO dugo. Mogli biste naići na probleme zbog struganja web stranica bez dopuštenja. Koristite na vlastiti rizik!

Ovdje je sav moj kod:

I to bi trebalo biti to. Upravo ste stvorili jednostavan alat za indeksiranje web stranice i mapiranje svih pronađenih URL-ova!

U zaključku

Slobodno nadogradite i poboljšajte ovaj kôd. Na primjer, možete izmijeniti program tako da pretražuje web stranice za adrese e-pošte ili telefonske brojeve dok ih pretražujete. Možete čak proširiti funkcionalnost dodavanjem argumenata naredbenog retka kako biste pružili mogućnost definiranja izlaznih datoteka, ograničenja pretraživanja na dubinu i još mnogo toga. Ovdje saznajte kako stvoriti sučelja naredbenog retka za prihvaćanje argumenata.

Ako imate dodatne preporuke, savjete ili resurse, molimo vas da podijelite s njima u komentarima!

Hvala na čitanju! Ako vam se svidio ovaj vodič i želite još ovakvog sadržaja, razbijte sljedeći gumb. ❤️

Svakako provjerite i moju web stranicu, Twitter, LinkedIn i Github.