Internetul este plin de informatie. Daca doresti sa aflii ceva, cel mai probabil o sa cauti acea informatie online. Dar cum poti gasii raspunsul pe care-l cauti, cand pe internet se afla trilioane de pagini web? De unde stii unde sa te uiti?
Din fericire, avem motoarele de cautare care fac asta pentru noi. Dar cum stiu acestea unde sa se uita? Cum pot sa aleaga cateva pagini din atata continut online?

Ce este un web crawler?
Un web crawler (sau spider) este un bot ce se intalneste pe internet. Acesta are deseori scopuri bune, cum ar fi indexarea paginilor de catre Google. Motoarele de cautare precum si alte tipuri de site-uri folosesc crawlere web pentru a-si actualiza continutul.
Bine-nteles, acesti boti consuma resurse in momentul cand acceseaza aceste sisteme si deseori o fac fara aprobarea acestora. Exista mai multe mecanisme prin care site-urile care nu doresc sa fie crawlate pot face stiut acest lucru. Unul dintre aceste mecanisme este modificarea fisierului robots.txt.
User-agent: Google Disallow: /
Cum functioneaza un web crawler?
In principiu, sunt 3 pasi necesar atunci cand vorbim despre un crawler web.
- Analizeaza continutul util de pe site (titluri, headinguri, etc)
- Salveaza toate linkurile pe care le gasesti intr-o coada
- Sterge pagina vizitata si acceseaza urmatoarea pagina din coada
Procesul se va repeta pana in momentul cand nu mai sunt pagini in coada.
Este legal sa folosesti web crawlere?
Web crawling-ul nu este illegal daca il folosesti ocazional. Pana la urma, ai putea sa obtii acele informatii de unul singur, fara ajutorul unui bot. Companiile mici (startup-urile) iubesc aceasta tehnica pentru ca este o metoda ieftina si puternica pentru a obtine date.
Wikipedia: Philosophy
Pentru a construii primul nostru crawler in Python ne vom baza pe urmatorul mit: se spune ca daca apesi pe primul link al unei pagini Wikipedia, intr-un final o sa ajungi inevitabil la pagina Philosophy.
import queue
from robobrowser import RoboBrowser
from bs4 import BeautifulSoup
coada = queue.Queue()
linkuriVizitate = [] # Creeam o lista care va retine ce pagini am vizitat
def parcurgePagina(URL):
linkuriVizitate.append(URL)
browser = RoboBrowser(parser="html5lib") # Deschidem un mini-browser
browser.open(URL) # Vizitam URL-ul in acel mini-browser
htmlpage = str(browser.parsed) # Salvam in variabila htmlpage ceea ce browser-ul nostru vede
bsoup = BeautifulSoup(htmlpage, "html5lib") # Convertim rezultatul intr-o variabila de tipul "BeautifulSoup"
print("[OPEN]: " + bsoup.title.string)
continutPrincipal = bsoup.find("div", {"class": "mw-parser-output"}) # Selectam zona principala
try:
divNota = continutPrincipal.find("div", {"role": "note"}) # Selectam div-ul de notite
divNota.decompose() # Eliminam div-ul de notite
except:
print("[WARNING]: Nu am gasit nici o notita")
try:
tabel = continutPrincipal.find("table") # Selectam tabelul
tabel.decompose() # Eliminam tabelul
except:
print("[WARNING]: Nu am gasit nici un tabel.")
flag = False
elemente = 0
for paragraf in continutPrincipal.find_all('p'): # Parcurgem toate paragrafele
for link in paragraf.find_all('a'): # Parcurgem toate linkurile
linkURL = link.get('href')
if linkURL is not None and ":" not in linkURL and "/wiki/" in linkURL: # Daca in link nu se afla ":" si in acelasi timp link-ul contine "/wiki/"
if linkURL not in linkuriVizitate: # Daca nu am mai vizitat deja pagina
coada.put(linkURL) # Plasam pagina in coada
linkuriVizitate.append(linkURL) # Plasam pagina in lista principala
elemente += 1
if elemente == 3:
flag = True
break
if flag is True:
break
startURL = input("Introdu URL-ul de pornire: ") #Citim URL-ul de la tastatura
baseURL = "https://en.wikipedia.org/"
parcurgePagina(startURL)
while not coada.empty():
pagina = coada.get()
if pagina == '/wiki/Philosophy':
print("AM GASIT PAGINA IN " + str(len(linkuriVizitate)) + " PASI")
break
parcurgePagina(baseURL + pagina)