fbpx

Ce este un Web Crawler – Tutorial Python

de Mihai-Alexandru

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.

  1. Analizeaza continutul util de pe site (titluri, headinguri, etc)
  2. Salveaza toate linkurile pe care le gasesti intr-o coada
  3. 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)
Comentarii

S-ar putea sa iti placa