Hoe het bouwen van een URL crawler voor het toewijzen van een website met behulp van Python

door Ahad Sheriff

Een eenvoudig project voor het leren van de grondbeginselen van het web scraping

Voordat we beginnen, laten we ervoor zorgen dat we begrijpen wat web scraping is:

Web scraping is het proces van het extraheren van gegevens van websites die te presenteren in een format dat gebruikers gemakkelijk kunnen begrijpen.

in deze tutorial wil ik laten zien hoe eenvoudig het is om een eenvoudige URL crawler in Python te bouwen die je kunt gebruiken om websites in kaart te brengen. Hoewel dit programma is relatief eenvoudig, het kan een geweldige introductie tot de fundamenten van web schrapen en automatisering. We zullen ons richten op het recursief extraheren van links van webpagina ‘ s, maar dezelfde ideeën kunnen worden toegepast op een groot aantal andere oplossingen.

ons programma zal zo werken:

  1. bezoek een webpagina
  2. schraap alle unieke URL ’s die op de webpagina zijn gevonden en voeg ze toe aan een wachtrij
  3. recursief URL’ s één voor één verwerken totdat we de wachtrij
  4. Printerresultaten

eerste dingen eerst

het eerste wat we moeten doen is alle benodigde bibliotheken importeren. We zullen worden met behulp van BeautifulSoup, verzoeken, en urllib voor web schrapen.

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

vervolgens moeten we een URL selecteren om vanaf te kruipen. Terwijl u kunt kiezen voor een webpagina met HTML-links, Ik raad het gebruik van ScrapeThisSite. Het is een veilige zandbak die je kunt kruipen zonder in de problemen te komen.

url = "https://scrapethissite.com"

vervolgens moeten we een nieuw deque-object maken zodat we eenvoudig nieuw gevonden links kunnen toevoegen en ze kunnen verwijderen zodra we klaar zijn met het verwerken ervan. Vul het deque vooraf in met uw url variabele:

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

we kunnen dan een set gebruiken om unieke URL ’s op te slaan zodra ze zijn verwerkt:

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

We willen ook bijhouden van lokale (hetzelfde domein als het doel), buitenlandse (ander domein als het doel), en gebroken URL’ s te houden:

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

tijd om

te crawlen met dit alles op zijn plaats, kunnen we nu beginnen met het schrijven van de eigenlijke code om de website te crawlen.

we willen kijken naar elke URL in de wachtrij, zien of er extra URL ‘ s binnen die pagina en voeg ze toe aan het einde van de wachtrij totdat er geen meer over zijn. Zodra we klaar zijn met het schrapen van een URL, zullen we deze verwijderen uit de wachtrij en toevoegen aan de processed_urls set voor later gebruik.

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

voeg vervolgens een uitzondering toe om gebroken webpagina ‘ s op te vangen en voeg deze toe aan de broken_urls set voor later gebruik:

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

We moeten dan aan voor de basis-URL van de webpagina, zodat we gemakkelijk kunnen onderscheiden van lokale en buitenlandse adressen:

# 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 if '/' in parts.path else url

Initialiseren BeautifulSoup voor het verwerken van de HTML-document:

soup = BeautifulSoup(response.text, "lxml")

schaaf Nu de web-pagina voor alle links en sorteer ze toevoegen aan hun bijbehorende set:

for link in soup.find_all('a'): # extract link url from the anchor anchor = link.attrs 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)

Daar wil ik beperk mijn crawler naar lokale adressen alleen, voeg ik het volgende toe te voegen nieuwe Url ’s om onze wachtrij:

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

Als u wilt kruipen alle Url’ s gebruiken:

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

Waarschuwing: De manier waarop het programma momenteel werkt, kruipen buitenlandse URL ‘ s zal een zeer lange tijd duren. Je zou kunnen krijgen in de problemen voor het schrapen van websites zonder toestemming. Gebruik op eigen risico!

voorbeeld uitvoer

hier is al mijn code:

en dat moet het zijn. Je hebt zojuist een eenvoudige tool gemaakt om een website te crawlen en alle gevonden URL ‘ s in kaart te brengen!

concluderend

voel je vrij om op deze code voort te bouwen en deze te verbeteren. U kunt het programma bijvoorbeeld wijzigen om webpagina ‘ s te zoeken naar e-mailadressen of telefoonnummers terwijl u ze kruipt. U kunt zelfs de functionaliteit uitbreiden door command line argumenten toe te voegen om de mogelijkheid te bieden om uitvoerbestanden te definiëren, zoekopdrachten te beperken tot diepte, en nog veel meer. Meer informatie over het maken van opdrachtregelinterfaces om argumenten te accepteren.

Write a Comment

Het e-mailadres wordt niet gepubliceerd.