de Ahad Sheriff

Cum se construiește un crawler URL pentru a mapa un site web folosind Python

Un proiect simplu pentru învățarea elementelor de bază ale răzuirii web

Cum se construieste un crawler URL pentru a mapa un

Înainte de a începe, să ne asigurăm că înțelegem ce este web scraping:

Răzuire web este procesul de extragere a datelor de pe site-uri web pentru a le prezenta într-un format pe care utilizatorii îl pot înțelege cu ușurință.

În acest tutorial, vreau să demonstrez cât de ușor este să construiești un URL crawler simplu în Python pe care să îl poți folosi pentru cartografierea site-urilor web. Deși acest program este relativ simplu, acesta poate oferi o introducere excelentă la elementele fundamentale ale răzuirii web și automatizării. Ne vom concentra pe extragerea recursivă a linkurilor din paginile web, dar aceleași idei pot fi aplicate la o multitudine de alte soluții.

Programul nostru va funcționa astfel:

  1. Accesați o pagină web
  2. Scrapați toate adresele URL unice găsite pe pagina web și adăugați-le la o coadă
  3. Procesați recursiv URL-ul pe rând până când epuizăm coada
  4. Imprimați rezultatele

Să începem cu începutul

Primul lucru pe care ar trebui să-l facem este să importăm toate bibliotecile necesare. Vom folosi BeautifulSoup, solicitări, și urllib pentru răzuire web.

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

Apoi, trebuie să selectăm o adresă URL din care să începem accesarea cu crawlere. Deși puteți alege orice pagină web cu linkuri HTML, vă recomand să o utilizați ScrapeThisSite. Este o cutie de nisip sigură pe care o puteți târâ fără să aveți probleme.

url = “https://scrapethissite.com”

Apoi, va trebui să creăm un nou deque obiect, astfel încât să putem adăuga cu ușurință linkuri nou găsite și să le eliminăm odată ce le-am terminat de procesat. Pre-populează deque cu url variabil:

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

Putem folosi apoi un a stabilit pentru a stoca adresele URL unice după ce au fost procesate:

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

De asemenea, dorim să ținem evidența adreselor URL locale (același domeniu ca ținta), străine (domeniu diferit ca țintă) și a adreselor URL defecte:

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

Time To Crawl

Cu toate acestea la locul lor, acum putem începe să scriem codul real pentru a accesa cu crawlere site-ul web.

Vrem să ne uităm la fiecare adresă URL din coadă, să vedem dacă există alte adrese URL suplimentare în acea pagină și să le adăugăm pe fiecare la sfârșitul cozii până când nu mai rămâne. De îndată ce terminăm de răzuit un URL, îl vom elimina din coadă și îl vom adăuga la processed_urls setat pentru utilizare ulterioară.

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

Apoi, adăugați o excepție pentru a prinde orice pagini web rupte și adăugați-le la broken_urls setat pentru utilizare ulterioară:

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

Apoi, trebuie să obținem adresa URL de bază a paginii web, astfel încât să putem diferenția cu ușurință adresele locale și străine:

# 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

Inițializați BeautifulSoup pentru a procesa documentul HTML:

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

Acum răscoliți pagina web pentru toate linkurile și sortați adăugați-le la setul corespunzător:

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)

Deoarece vreau să-mi limitez crawlerul doar la adrese locale, adaug următoarele pentru a adăuga adrese URL noi la coada noastră:

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

Dacă doriți să accesați cu crawlere toate adresele URL, utilizați:

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

Avertizare: Modul în care funcționează programul în prezent, accesarea cu crawlere a adreselor URL străine va dura un FOARTE perioadă lungă de timp. S-ar putea să aveți probleme pentru răzuirea site-urilor web fără permisiune. Folosiți pe propria răspundere!

Cum se construieste un crawler URL pentru a mapa un
Eșantion de ieșire

Iată tot codul meu:

Și asta ar trebui să fie. Tocmai ați creat un instrument simplu pentru a accesa cu crawlere un site web și pentru a mapa toate adresele URL găsite!

In concluzie

Simțiți-vă liber să construiți și să îmbunătățiți acest cod. De exemplu, puteți modifica programul pentru a căuta în paginile web adrese de e-mail sau numere de telefon în timp ce le parcurgeți cu crawlere. Puteți chiar extinde funcționalitatea adăugând argumente din linia de comandă pentru a oferi opțiunea de a defini fișiere de ieșire, de a limita căutările la adâncime și multe altele. Aflați despre cum să creați interfețe de linie de comandă pentru a accepta argumente Aici.

Dacă aveți recomandări, sfaturi sau resurse suplimentare, vă rugăm să ne împărtășiți din comentarii!

Mulțumesc pentru lectură! Dacă ți-a plăcut acest tutorial și dorești mai mult conținut de genul acesta, asigură-te că spargi butonul următor. ❤️

De asemenea, asigurați-vă că ați verificat site-ul web, Stare de nervozitate, LinkedIn, și Github.