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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
User-agent: Google
Disallow: /
User-agent: Google Disallow: /
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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)
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)
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