Kuinka luoda URL-indeksoija verkkosivuston kartoittamiseksi Pythonilla

Yksinkertainen projekti web-kaavinnan perusteiden oppimiseksi

Ennen kuin aloitamme, varmista, että ymmärrämme, mitä web-kaavinta on:

Verkon kaavinta on prosessi, jolla tietoja kerätään verkkosivustoilta esittämään ne muodossa, jonka käyttäjät voivat helposti ymmärtää.

Tässä opetusohjelmassa haluan osoittaa, kuinka helppoa on rakentaa yksinkertainen URL-indeksointirobotti Pythoniin, jota voit käyttää verkkosivustojen kartoittamiseen. Vaikka tämä ohjelma on suhteellisen yksinkertainen, se voi tarjota erinomaisen johdannon web-kaavinnan ja automaation perusteisiin. Keskitymme linkkien rekursiiviseen purkamiseen verkkosivuilta, mutta samoja ideoita voidaan soveltaa lukemattomiin muihin ratkaisuihin.

Ohjelmamme toimii näin:

  1. Käy verkkosivulla
  2. Kaavi kaikki verkkosivulta löytyvät yksilölliset URL-osoitteet ja lisää ne jonoon
  3. Käsittele rekursiivisesti URL-osoitteet yksitellen, kunnes jono loppuu
  4. Tulosta tulokset

Ensimmäiset asiat ensin

Ensimmäinen asia, joka meidän pitäisi tehdä, on tuoda kaikki tarvittavat kirjastot. Käytämme BeautifulSoupia, pyyntöjä ja urllib-tiedostoja verkkosivujen raaputtamiseen.

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

Seuraavaksi meidän on valittava URL, josta indeksointi aloitetaan. Vaikka voit valita minkä tahansa verkkosivun, jolla on HTML-linkkejä, suosittelen käyttämään ScrapeThisSite-ohjelmaa. Se on turvallinen hiekkalaatikko, jonka voit indeksoida joutumatta vaikeuksiin.

url = “//scrapethissite.com”

Seuraavaksi meidän on luotava uusi deque-objekti, jotta voimme helposti lisätä äskettäin löydetyt linkit ja poistaa ne, kun olemme viimeistelleet ne. Esitäytä deque urlmuuttujallasi:

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

Sitten voimme käyttää sarjaa tallentaa yksilölliset URL-osoitteet, kun ne on käsitelty:

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

Haluamme myös seurata paikallisia (sama verkkotunnus kuin kohde), ulkomaisia ​​(eri verkkotunnus kohteena) ja rikkinäisiä URL-osoitteita:

# 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()

Aika indeksoida

Kun kaikki tämä on paikallaan, voimme nyt alkaa kirjoittaa todellisen koodin indeksoida verkkosivusto.

Haluamme tarkastella jokaista jonossa olevaa URL-osoitetta, tarkistaa, onko tällä sivulla muita URL-osoitteita, ja lisätä kukin jonon loppuun, kunnes niitä ei ole jäljellä. Heti kun URL-osoitteen kaavinta on valmis, poistamme sen jonosta ja lisätään processed_urlssarjaan myöhempää käyttöä varten.

# 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)

Lisää seuraavaksi poikkeus, jotta kaikki rikkinäiset verkkosivut saadaan kiinni ja lisää ne broken_urlssarjaan myöhempää käyttöä varten:

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

Meidän on sitten hankittava verkkosivun perus-URL, jotta voimme helposti erottaa paikalliset ja ulkomaiset osoitteet:

# 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

Alusta BeautifulSoup HTML-asiakirjan käsittelemiseksi:

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

Kaavi nyt kaikki linkit verkkosivulta ja lisää ne lajittelemalla niitä vastaavaan sarjaan:

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)

Koska haluan rajoittaa indeksointirobotin vain paikallisiin osoitteisiin, lisäät seuraavat lisäämällä uudet URL-osoitteet jonoon:

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

Jos haluat indeksoida kaikki URL-osoitteet, käytä:

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

Varoitus: Tapa, jolla ohjelma toimii tällä hetkellä, ulkomaisten URL-osoitteiden indeksointi vie ERITTÄIN kauan. Saatat joutua vaikeuksiin verkkosivustojen kaapimisesta ilman lupaa. Käytä omalla vastuullasi!

Tässä on kaikki koodini:

Ja sen pitäisi olla se. Olet juuri luonut yksinkertaisen työkalun indeksoida verkkosivustoja ja kartoittaa kaikki löydetyt URL-osoitteet!

Tiivistettynä

Voit vapaasti rakentaa tätä koodia ja parantaa sitä. Voit esimerkiksi muokata ohjelmaa hakemaan verkkosivuilta sähköpostiosoitteita tai puhelinnumeroita indeksoidessasi niitä. Voit jopa laajentaa toimintoja lisäämällä komentoriviargumentteja tarjoamaan mahdollisuuden määrittää ulostulotiedostot, rajoittaa hakuja syvyyteen ja paljon muuta. Täältä saat lisätietoja komentoriviliittymien luomisesta argumenttien hyväksymiseksi.

Jos sinulla on muita suosituksia, vinkkejä tai resursseja, jaa kommenteissa!

Kiitos lukemisesta! Jos pidit tästä opetusohjelmasta ja haluat enemmän tällaista sisältöä, muista murskata seuraava seurantapainike. ❤️

Muista myös tarkistaa verkkosivustoni, Twitter, LinkedIn ja Github.