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)