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:
- Látogasson el egy weboldalra
- Kaparja ki a weboldalon található összes egyedi URL-t, és vegye fel őket egy sorba
- Rekurzív módon dolgozza fel az URL-eket egyesével, amíg kimerül a sor
- 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 url
vá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_urls
ké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_urls
ké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.