Hogyan készítsünk URL-bejárót egy webhely leképezéséhez a Python használatával

Egyszerű projekt a webes kaparás alapjainak elsajátításához

Mielőtt elkezdenénk, győződjön meg arról, hogy megértjük, mi az internetes kaparás:

A webes lekaparás az a folyamat, amikor az adatokat kinyerik a webhelyekről, hogy azokat olyan formátumban mutassák be, amelyet a felhasználók könnyen értelmezhetnek.

Ebben az oktatóanyagban azt szeretném bemutatni, hogy mennyire egyszerű felépíteni egy egyszerű URL-bejárót a Pythonban, amellyel webhelyeket térképezhet fel. Bár ez a program viszonylag egyszerű, nagyszerű bevezetést nyújthat a webes kaparás és automatizálás alapjaiba. Arra fogunk összpontosítani, hogy rekurzív módon nyerjünk ki linkeket a weboldalakról, de ugyanazok az ötletek számtalan más megoldáshoz alkalmazhatók.

Programunk így fog működni:

  1. Látogasson el egy weboldalra
  2. Kaparja ki a weboldalon található összes egyedi URL-t, és vegye fel őket egy sorba
  3. Rekurzív módon dolgozza fel az URL-eket egyesével, amíg kimerül a sor
  4. Eredmények nyomtatása

Először is

Az első dolog, amit meg kell tennünk, az az összes szükséges könyvtár importálása. A weboldal használatához a BeautifulSoup-ot, a kéréseket és az urllib-et fogjuk használni.

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

Ezután ki kell választanunk egy URL-t, ahonnan be kell kezdeni a feltérképezést. Bár bármilyen weboldalt választhat HTML hivatkozásokkal, javasoljuk a ScrapeThisSite használatát. Ez egy biztonságos homokozó, amellyel gond nélkül kúszhat.

url = “//scrapethissite.com”

Ezután létre kell hoznunk egy új deque objektumot, hogy könnyedén hozzá tudjuk adni az újonnan talált hivatkozásokat és eltávolítsuk őket, miután befejeztük a feldolgozásukat. Töltse fel előre a deque-t a urlváltozóval:

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

Ezután felhasználhatunk egy készletet egyedi URL-ek tárolására, miután azokat feldolgoztuk:

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

Továbbá nyomon akarjuk tartani a helyi (a céllal megegyező domain), az idegen (a cél domaintől eltérő domain) és a meghibásodott URL-eket:

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

Ideje feltérképezni

Mindezek mellett most elkezdhetjük írni a tényleges kódot, hogy feltérképezzük a weboldalt.

Meg akarjuk nézni a sor minden egyes URL-jét, megnézni, hogy vannak-e további URL-ek az oldalon, és mindet hozzá kell adni a sor végéhez, amíg egyik sem marad. Amint befejezzük az URL lekaparását, eltávolítjuk a sorból, és hozzáadjuk a processed_urlskészlethez későbbi felhasználás céljából.

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

Ezután adjon hozzá egy kivételt a megszakadt weboldalak elkapásához, és adja hozzá őket a broken_urlskészlethez későbbi használatra:

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

Ezután meg kell szereznünk a weboldal alap URL-jét, hogy könnyen megkülönböztessük a helyi és külföldi címeket:

# 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

Inicializálja a BeautifulSoup-ot a HTML-dokumentum feldolgozásához:

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

Most kaparja el a weboldalt az összes hivatkozás után, és rendezze hozzá a megfelelő készlethez:

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)

Mivel a robotomat csak a helyi címekre szeretném korlátozni, az alábbiakat adom hozzá új URL-ek hozzáadásához a sorunkhoz:

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

Ha az összes URL-t be szeretné térképezni, használja:

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

Figyelem: A program jelenlegi működése, a külföldi URL-ek feltérképezése NAGYON sok időt vesz igénybe . Esetleg bajba kerülhet a webhelyek engedély nélküli kaparása. Használat csak saját felelősségre!

Itt van az összes kódom:

És ennek lennie kellene. Most létrehozott egy egyszerű eszközt egy webhely feltérképezéséhez és az összes talált URL feltérképezéséhez!

Összefoglalva

Bátran építsen és javítson erre a kódra. Például módosíthatja a programot úgy, hogy feltérképezése közben weblapokon keressen e-mail címeket vagy telefonszámokat. Akár kibővítheti a funkcionalitást parancssori argumentumok hozzáadásával, hogy lehetőséget adjon a kimeneti fájlok meghatározására, a keresések mélységre korlátozására és még sok minden másra. Itt megtudhatja, hogyan hozhat létre parancssori interfészeket az argumentumok elfogadásához.

Ha további ajánlásaival, tippjeivel vagy forrásaival rendelkezik, kérjük, ossza meg a megjegyzéseket!

Köszönöm, hogy elolvasta! Ha tetszett ez az oktatóanyag, és további hasonló tartalmakra vágysz, feltétlenül törd össze a követés gombot. ❤️

Ne felejtsd el meglátogatni a webhelyemet, a Twitteremet, a LinkedIn-t és a Githubot sem.