Che cos’è il SEO – Una guida introduttiva al Search Engine Optimization.

SEO cosa significa?

Il SEO, ovvero il Search Engine Optimization, è il processo di ottimizzazione di un sito web per migliorare la sua visibilità nei risultati di ricerca dei motori di ricerca, come Google.

Esistono varie tecniche per ottimizzare il proprio sito web con lo scopo di renderlo più appetibile ai vari crawler dei motori di ricerca. Per avere un buon posizionamento nella SERP (leggi significato su wikipedia) si possono utilizzare varie tecniche di ottimizzazione SEO, ma il fattore principale per avere un buon posizionamento è quello di realizzare delle pagine con contenuti interessanti capaci di attrarre pubblico.

Lo scopo dei motori di ricerca è infatti quello di soddisfare i propri utenti proponendo loro dei contenuti che possano essere interessanti ed utili.

Perche fare SEO?

Per ottenere un buon posizionamento nei risultati di ricerca, è importante che il sito soddisfi i criteri stabiliti dai motori di ricerca per determinare la qualità e la pertinenza dei risultati.

Il SEO può aiutare a migliorare la visibilità di un sito nei risultati di ricerca e, di conseguenza, aumentare il traffico verso il sito. Tuttavia, è importante notare che i risultati del SEO non sono immediati e possono richiedere del tempo per essere visibili.

Più traffico = Più Conversioni?

Fare SEO è importante per ottenere una buona visibilità e fare in modo di ricevere più visite organiche (visite di utenti che vi hanno trovato su un motore di ricerca e non tramite un banner pubblicitario).

Tuttavia non è detto che maggiori visite significhi sempre ottenere maggiori profitti: a meno che no stiamo parlando di un blog che guadagna sul traffico ricevuto e sulla pubblicità mostrata agli utenti.

Oltre a ricevere un buon traffico sul proprio sito è necessario avere l’abilità di convertire quel bacino di visitatori curiosi in clienti paganti: convertire le visite in vendite, prenotazioni o qualsiasi altra azione target di cui avete bisogno per trarre profitto al vostro sito web.

Come fare SEO?

Ci sono molti fattori che influiscono sul posizionamento di un sito nei risultati di ricerca, come ad esempio la qualità e la pertinenza del contenuto, la presenza di parole chiave pertinenti, la struttura del sito e la presenza di link esterni che puntano al sito.

Creare contenuti utili per gli utenti

Anche se gli spider o crawler dei motori di ricerca scansionano continuamente la rete, a cadenza anche giornaliera, non è detto che il nostro sito compaia subito sulle pagine dei risultati di Google, di Bing o di altri motori come Yahoo. Spesso devono passare dei giorni, i dati prodotti dalla scansione del sito devono essere elaborati ed anche se applichiamo tutte le migliori tecniche di SEO, se non abbiano generato un contenuto interessante per gli utenti difficilmente il motore di ricerca ci prenderà in considerazione.

Affidarsi ad uno specialista

Inoltre, è importante ricordare che i motori di ricerca continuamente aggiornano i loro algoritmi per fornire risultati di ricerca sempre più pertinenti e di qualità. Pertanto, è importante che il SEO sia un processo continuo e che il sito venga costantemente ottimizzato per soddisfare i criteri stabiliti dai motori di ricerca.

Fare SEO è quasi un’arte: non vi sono regole scritte e ben definite. Ogni sito web è diverso e si possono sfruttare diverse tecniche a seconda della nicchia e del pubblico a cui si rivolge. In alcuni casi se si fanno azioni errate si può ottenere l’effetto contrario ed addirittura essere penalizzati o bannati dai motori di ricerca.

Per questo motivo è meglio affidarsi ad uno specialista che sappia guidarvi e così, solo dopo uno studio ed una analisi personalizzata delle vostre esigenze, proporre le migliori tecniche SEO da utilizzare per le vostre esigenze.

SE HAI BISOGNO DI CONSULENZA O VUOI FARE DELLE DOMANDE COMPILA IL FORM QUI SOTTO E TI RICONTATTERO’ SUBITO…

    Crediti: Foto articolo di Merakist su Unsplash

    Risorse Data Science

    Una serie di Jupyter Notebooks per studiare le funzioni principali di Pandas ed altri strumenti per la Data Science

    • Lezione 01: Introduzione a Pandas
    • Lezione 02: Gestire i duplicati e concatenare i dati
    • Lezione 03: Raggruppare i dati
    • Lezione 04: Data Visualization
    • Lezione 05: Analisi Statistica
    • Lezione 06: Cenni di statistica
    • Lezione 07: Correlazione

    ACCEDI ALLE RISORESE SUL MIO ACCOUNT GITHUB: Link Github

    Algoritmi di ottimizzazione

    Nei casi più semplici un ottimizzatore ci permette di conoscere il massimo ed il minimo di una funzione: nello specifico quei parametri che passati alla funzione ci permettono di trovarne il suo valore massimo ed il suo valore minimo.

    Nel caso di una o due variabili l’individuazione del punto minimo o massimo è abbastanza facile ed intuitiva anche solo guardando la rappresentazione grafica della nostra funzione in un piano a due o tre dimensioni. Ma quando il numero della variabili aumenta difficilmente possiamo concepire una soluzione per il nostro problema: ed è qui che entra in gioco il machine learning.

    Gli algoritmi di ottimizzazione ci permettono di individuare i coefficienti ideali che passati alla funzione ci permettono di avvicinarci al più possibile ai valori reali con le nostre previsioni.

    Esistono numerosi algoritmi di ottimizzazione con varie caratteristiche che li rendono più o meno adatti a determinati modelli di machine learning.

    • Gradient Descendt
    • ADAM
    • Adadelta
    • Adagrad
    • Adamax
    • RMSprop
    • Stochastic Gradient Descendt

    L’algoritmo di ottimizzazione più facile da comprendere ed al tempo stesso molto utilizzato è il Gradiend Descendt: che consiste nell’andare a stimare il punto di minimo della funzione di costo.

    Partendo da un punto casuale si calcola la derivata della funzione di costo di quel punto per verificare l’inclinazione della curva alla ricerca del punto di minimo in cui la derivata dovrebbe essere pari a zero.

    La derivata di una funzione è pari a zero se la funzione è costante, è negativa se la funzione è decrescente ed è positiva se è crescente.

    Per muoverci lungo la funzione dobbiamo scegliere un valore arbitrario alpha chiamato learning rate che indica la velocità (o la grandezza dei passi) con cui dobbiamo spostarci.

    Parametri troppo grandi di alpha ci faranno saltare da una parte all’altra della curva facendoci mancare il punto di minimo, mentre parametri troppo piccoli faranno aumentare la quantità di calcoli necessari per raggiungere il minimo.

    Gradiente di una funzione

    Quanto abbiamo scritto sopra ci ha rinfrescato il concetto di derivata di una funzione ad una variabile utile per risolvere una regressione lineare semplice. Ma nel caso di una regressione lineare multipla con più features come dobbiamo procedere?

    Il procedimento è analogo, sarà necessario andare a calcolare le derivate parziali di ogni feature per poi ottenere un gradiente che non è altro che il vettore di tutte le derivate parziali calcolate.

    Graficamente in un grafico a tre dimensioni come nell’esempio qui sotto la derivata parziale della funzione f rispetto al piano alla variabile x sarà data dall’inclinazione della retta t1 mentre rispetto alla seconda variabile y sarà data dall’inclinazione della retta t2.

    Fonte Wikipedia : https://commons.wikimedia.org/wiki/File:Totalni_diferencial_geom_vyznam.svg

    La regressione lineare

    Tra i più semplici modelli di apprendimento supervisionati c’è quello basato sulla regressione lineare. Il funzionamento di una semplice regressione lineare è alla base di molto più complessi come le reti neurali artificiali.

    In poche parole quello che fa la regressione lineare e stabilire una correlazione tra una variabile dipendente y ed una variabile indipendente x sotto forma di un polinomio di primo grado con tanti termini quante sono le figure del nostro dataset:

    Facciamo un semplice esempio: immaginiamo di avere una dataset dove una serie di appartamenti caratterizzati da due variabili quantitative continue come ad esempio il valore in euro e la grandezza in metri quadri. Immaginiamo di voler costruire un modello capace di predire il valore di un appartamento in base alla sua grandezza in metri quadri.

    METRI QUADRI VALORE €
    100 145.000
    120 180.000
    60 110.000
    130 200.000
    80 140.000
    190 220.000
    200 250.000
    140 ???

    Un problema di regressione lineare si può ridurre ad individuare la relazione che ci permette di tracciare la funzione f(x) che ad ogni valore di x (variabile indipendente) ci permette di individuare il valore y del nostro target (variabile dipendente), ovvero nel nostro caso ci permette di conoscere il valore di un appartamento partendo dalla sua grandezza in metri quadri.

    Considerando il problema da un punto di vista grafico possiamo tracciare in uno scatter plot i vari punti dei nostri appartamenti ponendo nell’asse delle ascisse la grandezza in metri quadri e nell’asse delle ordinate il valore in euro. In questo esempio si rileva che ad un amento dei metri quadri corrisponderà un aumento del valore dell’immobile e possiamo esprimere questa relazione grazie ad una retta di regressione.

    La regressione consiste nel tracciare la retta che più si avvicina a tutti i punti del grafico, stabilendo in questo modo una relazione tra la variabile indipendente e quella dipendente. Una retta può essere scritta come una equazione in maniera esplicita dove di y risulta essere il la somma tra il valore q (intercetta della retta con l’asse Y) ed il prodotto della variabile indipendente x con m (il coefficiente angolare che determina l’inclinazione della retta).

    I valori q ed m sono quello che la regressione lineare deve ottimizzare per trovare la retta che meglio si adatta i punti del nostro grafico. Nel piano cartesiano possono essere rappresentate rette, per trovare in valori di q ed m che meglio esprimono la relazione tra valore dell’immobile e metri quadri dobbiamo utilizzare una funzione di costo.

    La funzione di costo

    Una funzione di costo fornisce una distanza tra il nostro modello e quello ideale, ovvero il modello che ritorna sempre il risultato corretto. Serve quindi per confrontare un modello di machine learning con quello idealmente perfetto.

    Esistono diversi tipi di funzione di costo ma, per quanto riguarda la regressione lineare di cui abbiamo parlato nell’articolo precedente, la funzione di costo più utilizzata è quella della somma dei quadrati residui chiamata in inglese Sum of the Squared Residual (RRS).

    Per calcolare la somma dei quadrati residui dobbiamo andare a calcolare per ogni elemento della nostra osservazione la differenza tra il valore reale ed il valore predetto dalla nostra regressione lineare elevandola al quadrato per poi sommare tutti i valori ottenuti

    Minore è il risultato della funzione di costo e maggiore sarà la qualità del nostro modello, questa metrica ci permette di misurare quanto è valido un modello. A questo punto abbiamo bisogno di un metodo che ci permetta di minimizzare la nostra funzione di costo: per questo compito dobbiamo affidarci ad un algoritmo di ottimizzazione a cui dedicheremo il prossimo post..

    A cosa serve il machine learning?

    Negli ultimi anni si è sentito parlare sempre più spesso di Machine Learning e di Intelligenza Artificiale diventando uno dei temi più attuali. In realtà una prima definizione del Machine Learning è stata fatta nel 1950 da Arthur Samuel, uno dei pionieri dell’intelligenza artificiale, che definiva questa branca dell’informatica in questo modo:

    Il machine learning è il “campo di studio che dà ai computer l’abilità di apprendere (a realizzare un compito) senza essere esplicitamente programmati a farlo”.

    Arthur Samuel

    Nella programmazione classica l’elemento alla base di ogni elaborazione o software è l’algoritmo: un procedimento che viene utilizzato per poter risolvere un determinato problema. Si parte da una serie di input e procedendo in modo sistematico attraverso una serie di passaggi con possibili scelte predeterminate si arriva ad una conclusione che produce un output. Per fare un esempio con la vita reale: la semplice ricetta di una torta è un algoritmo che ci permette di ottenere una calda crostata di mele partendo da alcuni input e processandoli attraverso una serie di elaborazioni.

    Alcuni procedimenti possono essere risolti ed elaborati attraverso la creazione di specifici algoritmi che prevedano tutte le possibili scelte e soluzioni, mentre altri problemi sono di una natura tale che la creazione di un algoritmo non è possibile o prevederebbe una così vasta serie di variabili e passaggi da renderne la creazione impossibile.

    Riconoscere il contenuto di una fotografia, insegnare un’auto a guidare da sola, creare un metodo efficacie di raccomandazione prodotti o un sistema di fraud detection sono tutti compiti che potrebbero essere risolti sempre con un algoritmo: ma le dimensioni di istruzioni ed il numero delle variabili da creare sarebbe talmente vasto da renderne impossibile la realizzazione.

    Ad esempio non è umanamente possibile creare un programma che riconosca se in una fotografia è presente la figura di un cane, di un gatto o di un volto umano attraverso la realizzazione di un algoritmo… qui entra in gioco il Machine Learning!

    Il Machine Learning è quella branca dell’informatica che permette ai computer di addestrarsi in modo autonomo: vengono forniti alla macchina una vasta quantità di input ed una serie di ouput lasciando che sia la macchina stessa a determinare l’algoritmo ottimale per risolvere il problema. In sostanza il Machine Learning serve per insegnare alle macchine a realizzare in maniera autonoma degli algoritmi per la soluzione di un problema.

    Questo insegnamento nel machine learning supervisionato avviene attraverso due passaggi:

    • L’addestramento: dove vengono forniti una serie numerosa di esempi di input ed output in base alla quale la macchina deve poter generare un proprio algoritmo, che nel mondo del machine learning viene chiamato modello.
    • La Predizione: una volta finito l’addestramento con una mole di dati ed esempio sufficientemente grande è possibile effettuale la predizione degli output semplicemente fornendo degli input (ad esempio mostrando una foto di un cane o un gatto il computer sarà in grado di determinare a quale categoria appartiene il soggetto della foto).
    Modello Machine Learning in fase di predizione

    Ovviamente esisterà un margine di errore, quello di cui si occupa un Data Scientist nel machine learning è la realizzazione di modelli con margini di errori sempre più ridotti. Nel machine learning classico le tipologie di problemi che bene si adattano ad essere risolti sono quelle che presentano una relazione lineare e che possono essere predetti attraverso l’individuazione di una certa correlazione tra input ed output.

    Per modelli più complessi non lineari ci si deve affidare ad altra tecnologia nata verso la fine degli anni ’80: quella delle reti neurali, dove aumentando il livello di attrazione del problema sarà possibile per la macchina andare ad individuare una certa correlazione.

    Perchè il machine learning si diffonde solo oggi?

    Può sorgere spontanea la domanda: se viene concepito nel 1950 e negli anni ’80 viene migliorato ampliandone il campo di applicazione per che il machine learning si diffonde solo ora?

    Principalmente per due motivazioni:

    • la prima è la presenza al giorno d’oggi di una quantità di dati enorme (i Big Data) che si sono creati inseguito alla diffusione di Internet;
    • la seconda è la potenza di calcolo raggiunta dalla macchine moderne che una volta era impensabile. La potenza che teniamo nel palmo di una mano all’interno del nostro smartphone e decisamente superiore dei computer che hanno permesso lo sbarco sulla luna.

    Se siete curiosi e volete maggiori informazioni sull’argomento suggeriamo di procedere con calma e leggere l’articolo sulla regressione lineare nel machine learning.

    Trovare i selettori XPath

    Abbiamo visto nel pezzo precedente cosa sono i selettori XPath e perchè sono importanti per trovare i dati che vogliamo all’interno di un documento HTML.

    Ma questo tipo di selettori hanno una sintassi particolare che all’inizio può essere difficile da comprendere, quindi: come possiamo fare per conoscere i selettori giusti da utilizzare?

    Se andiamo a vedere la struttura di una pagine, pur semplice che sia, risulta davvero ostico andare a riconoscere la parte di codice HTML che rappresenta il nodo che contiene i dati che ci interessano.

    Per fortuna ogni browser moderno è dotato di alcuni strumenti per sviluppatori, accessibile premendo il tasto F12 oppure andando a selezionare direttamente il nodo che ci interezza e cliccando con il pulsante destro del mouse andare a scegliere l’opzione ‘Esamina elemento’ o ‘Inspect’ a seconda del browser.

    Premendo F12 si accede al pannello per sviluppatori del browser.

    Usando questa ultima opzione ci verrà mostrata nella console per sviluppatori la parte di codice che HTML rappresenta l’elemento sul quale abbiamo cliccato.

    A questo punto per ottenere il selettore XPath è sufficiente andare a cliccare con il tasto destro del mouse sulla porzione di codice HTML che ci interessa selezionare il comando ‘Copia…’ e poi andare a selezionare l’opzione che ci interessa ovvero ‘Copia XPath’. Avremo cosi nella memoria del blocco appunti il selettore XPath univoco per quell’elemento.

    Se vuoi una dimostrazione pratica puoi guardare il breve video qui sotto riportato, dura meno di un minuto.

    Se lo hai trovato utile metti un like ed iscriviti al mio canale 😉

    Estrazione dei dati con Scrapy Shell

    Il metodo migliore per imparare come estrarre i dati da una pagina HTML usando i selettori CSS o XPath è quello di lanciare la Scrapy Shell da terminale andando ad indicare la pagina che vogliano analizzare:

    scrapy shell 'http://quotes.toscrape.com/page/1/'

    NOTA: Nel caso di OS Windows ricordarsi di utilizzare le doppie virgolette:

    # Doppie virgolette per Windows 
    scrapy shell "http://quotes.toscrape.com/page/1/"

    La Scrapy Shell è particolarmente adatta durante le fasi di sviluppo o di debug di un progetto di estrazione dati perchè permette di testare rapidamente i selettori da usare ed i risultati che essi producono.

    Quello che ottentiamo sara qualcosa di simile a questo:

    2019-10-27 00:04:17 [scrapy.core.engine] DEBUG: Crawled (200)  (referer: None)
    [s] Available Scrapy objects:
    [s] scrapy scrapy module (contains scrapy.Request, scrapy.Selector, etc)
    [s] crawler
    [s] item {}
    [s] request
    [s] response <200 http://quotes.toscrape.com/page/1/>
    [s] settings
    [s] spider
    [s] Useful shortcuts:
    [s] fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
    [s] fetch(req) Fetch a scrapy.Request and update local objects
    [s] shelp() Shell help (print this help)
    [s] view(response) View response in a browser
    In [1]: _

    A questo punto abbiamo attivato la nostra console di Scrapy ed abbiamo estratto la pagina che ci interessava che ora è disponibile come oggetto response. Ora possiamo provare ad estrarre degli elementi della pagina utilizzando i selettori CSS con l’oggetto response appena ottenuto:

     
    >>> response.css('title') [<Selector xpath='descendant-or-self::title' data='<title>Quotes to Scrape</title>'>]

    Quello che otteniamo da questo comando è una lista di elementi chiamata SelectorList. che rappresenta una lista di oggetti Selector contenuti in elementi XML/HTML che ci permettono di effettuare ulteriori operazioni di ricerca ed estrazione dati.

    Quindi abbiamo ottenuto degli oggetti, dei nodi della pagina HTML, ma non sono quello che cerchiamo effettivamente, nella maggior mparte dei casi quello che cerchiamo è il testo contenuto in essi. Per estrarre il testo possiamo scrivere il comando:

      
    >>> response.css('title::text').get()
    'Quotes to Scrape'

    Con questo comando viene riportato solo il primo elemento trovato dal selettore, nel caso in cui ci fosse una lista di elementi e volessimo ottenerli tutti dobbiamo scrivere:

    >>> response.css('title').getall() 
    ['<title>Quotes to Scrape</title>']

    Otteniamo così il risultato sotto forma di array o lista di elementi.

    Le combinazioni dei selettori CSS per individuare uno o più elementi della pagina sono davvero numerose, ovviamente dovete conoscere anche un po’ di HTML, DOM (Document Object Model) e di CSS (Cascade Style Sheet). Se siete pigri o volete la vita facile esiste un efficace strumento chiamato SelectorGadget, supportato dalla maggior parte dei browser, che aiuta molto nella ricerca del giusto selettore CSS.

    Introduzione ai selettori XPath

    A fianco dei selettori CSS esiste un altro tipo di selettori che hanno maggiore precisione, questi possono essere utilizzati con le espressioni XPath.

     
    >>> response.xpath('//title')
    [<Selector xpath='//title' data='<title>Quotes to Scrape</title>'>]
    >>> response.xpath('//title/text()').get()
    'Quotes to Scrape'

    I selettori XPath sono molto potenti e sono alla base delle ricerche dei selettori in Scrapy. Infatti i selettori CSS vengono trasformati da Scrapy in selettori XPath mentre è in esecuzione. Anche se hanno una sintassi e delle regole più difficili da comprendere a prima vista , le espressioni XPath permettono di navigare all’interno della struttura del documento ed avere una maggiore precisione. L’argomento è ampio è bene cercare della documentazione dedicata per comprendere meglio il loro utilizzo Nel pezzo successivo andiamo a vedere come trovare i selettori XPath utilizzando lo strumento per sviluppatori del nostro web browser.

    Creare un progetto in Scrapy

    Andiamo a vedere come realizzare il nostro primo progetto in Scrapy, supponiamo che abbiate già provveduto all’installazione, ma se così non fosse è sufficiente utilizzare il gestore di pacchetti python pip scrivendo nel nostro terminale:

    pip install scrapy

    Molto semplice, in pochi istanti il nostro sistema sarà pronto per accettare il nostro primo comando con il quale andremo a creare un progetto Scrapy, basta editare:

    scrapy startproject tutorial

    Questo andrà a creare una directory chiamata tutorial con il seguente contenuto:

    tutorial/
    scrapy.cfg # file per le configurazioni
    tutorial/  # directory dove scriveremo il nostro codice
    __init__.py
    items.py # file per la definizione degli item
    middlewares.py # file per la definizione dei middlewares
    pipelines.py # file per la definizione dei pipeline
    settings.py # file per la definizione delle impostazioni
    spiders/ # directory dove metteremo gli spiders
    __init__.py

    Il nostro primo Spider

    Gli ‘Spiders‘ sono classi che Scrapy utilizza per raccogliere informazioni da un sito Web (o da un gruppo di siti Web). Devono sotto-classare scrapy.Spider e definire le richieste iniziali da effettuare, possiamo anche indicare eventualmente come seguire i collegamenti nelle pagine e come analizzare il contenuto della pagina scaricata per estrarre i dati.

    Questo è il codice per il nostro primo Spider. Salvalo in un file chiamato ‘quotes_spider.py‘ nella directory tutorial / spiders nel tuo progetto:

    import scrapy 

    class QuotesSpider(scrapy.Spider):
    name = "quotes"
      def start_requests(self):
    urls = [
    'http://quotes.toscrape.com/page/1/',
    'http://quotes.toscrape.com/page/2/',
    ]
      for url in urls:
    yield scrapy.Request(url=url, callback=self.parse)
      def parse(self, response):
    page = response.url.split("/")[-2]
    filename = 'quotes-%s.html' % page
      with open(filename, 'wb') as f:
    f.write(response.body)
    self.log('Saved file %s' % filename)

    Abbiamo creato una classe QuoteSpider che è una sottoclasse scrapy.Spider e definisce alcuni attributi e metodi:

    • name: identifica il nostro Spider. Deve essere univoco all’interno di un progetto, ovvero non è possibile impostare lo stesso nome per Spider diversi.
    • start_requests (): deve restituire un iterabile di Requests (puoi restituire un elenco di URLs o scrivere una funzione generatore) da cui Spider inizierà a lavorare. Le richieste successive verranno generate successivamente da queste richieste iniziali.
    • parse (): un metodo che verrà chiamato per gestire la risposta scaricata per ciascuna delle richieste fatte. Il parametro response è un’istanza di TextResponse che contiene il contenuto della pagina e ha ulteriori metodi utili per gestirlo. Il metodo parse () di solito analizza la risposta, estraendo i dati scartati come dicts e anche trovando nuovi URL da seguire e creando nuove richieste da essi.

    Lanciamo il nostro Spider

    Per far funzionare il nostro ragno, saliamo nella directory del progetto ed eseguiamo:

    scrapy crawl quotes

    Questo comando esegue lo spider chiamato ‘quotes’ che abbiamo appena creato, ed invierà alcune richieste per il dominio quotes.toscrape.com come abbiamo indicato nella nostra funzione start_requests().

    Ora controllando i file nella directory corrente. Possiamo notare che sono stati creati due nuovi file: quotes-1.html e quotes-2.html, con il contenuto dei i rispettivi URL, come indicato dal nostro metodo parse().

    Scrapy ha pianificato gli oggetti scrapy.Request restituiti dal metodo start_requests del nostro Spider. Alla ricezione di una risposta per ciascuno, crea un’istanza di oggetti Response e chiama il metodo di callback associato alla richiesta (in questo caso, il metodo di parse) passando la risposta come argomento.

    Nota: il tutorial appena presentato è stato tratto dal tutorial ufficiale del sito del projetto scrapy.org. Viene presentato tradotto in Italiano per pura divulgazione a scopo educativo.

    Introduzione a Scrapy

    Scrapy è un framework di alto livello per il web crawling ed il web scraping, viene usato per navigare tra le pagine in rete ed estrarre dati da esse. Scrapy può essere utilizzato per molteplici scopi dall’estrazione di dati a fini statistici, dal monitoraggio di prezzi, alla creazione di arvhivi e basi di dati ed al testing automation.

    Uno dei principali vantaggi di Scrapy: è che le richieste vengono pianificate ed elaborate in modo asincrono. Ciò significa che Scrapy non ha bisogno di aspettare che una richiesta sia finita ed elaborata, può inviare un’altra richiesta o fare altre cose nel frattempo. Ciò significa anche che altre richieste possono continuare anche se alcune richieste falliscono o si verifica un errore durante la gestione permettendo di completare il lavoro di ricerca ed estrazione dati senza interruzioni del programma.

    Sebbene ciò ti consenta di eseguire ricerche per indicizzazione molto veloci (inviando contemporaneamente più richieste simultanee, in modo tollerante ai guasti) Scrapy permette anche di avere il controllo della ricerca per indicizzazione attraverso alcune impostazioni. Puoi fare cose come impostare un ritardo di download tra ogni richiesta, limitare la quantità di richieste simultanee per dominio o per IP e persino usare un’estensione a limitazione automatica che prova a capirle automaticamente.

    Panoramica dell’architettura

    Immagine originale tratta dal sito scrapy.org https://docs.scrapy.org/en/latest/_images/scrapy_architecture_02.png

    Il flusso di dati in Scrapy è controllato da un motore centrale (EXECUTION ENGINE) ed è rappresentato dai seguenti passaggi:

    1. Il motore ottiene gli indirizzi di partenza per far partire il crawler dai vari SPIDERS di un progetto.
    2. Il motore pianifica le richieste nell’utilità di pianificazione (SCHEDULER) e richiede la scansione delle richieste successive.
    3. Lo SCHEDULER restituisce le richieste successive al motore.
    4. Il motore invia le richieste al DOWNLOADER, passando attraverso i Downloader Middlewares (tramite i process_request ()).
    5. Una volta terminato il download della pagina, DOWNLOADER genera una risposta (con quella pagina) e la invia all’ENGINE, passando attraverso i Downloader Middlewares (tramite i process_response ()).
    6. Il motore riceve la risposta dal DOWNLOADER e la invia allo SPIDER per l’elaborazione, passando attraverso Spider Middleware (process_spider_input ()).
    7. Lo SPIDER elabora la risposta e restituisce gli oggetti raschiati dalla pagina e le nuove richieste (da seguire) al motore, passando attraverso il middleware Spider (process_spider_output ()).
    8. Il motore invia gli oggetti elaborati alle pipeline degli oggetti (ITEM PIPELINE), quindi invia le richieste elaborate all’utilità di pianificazione (SCHEDULER) e chiede eventuali richieste successive da sottoporre a scansione.
    9. Il processo si ripete (dal passaggio 1) fino a quando non ci sono più richieste dallo SCHEDULER.

    Nota: il tutorial appena presentato è stato tratto dal tutorial ufficiale del sito del projetto scrapy.org. Viene presentato tradotto in Italiano per pura divulgazione a scopo educativo.

    Python, Requests e Tor proxy

    Nel caso in cui avessimo necessita di utilizzare un proxy per estrarre pagine web in modo anonimo possiamo utilizzare l’accoppiata Requests e Tor.

    Request è una libreria HTTP di Python che permette di effettuare in modo semplice delle chiamate ad un web server.

    Tor è un software che permette di instaurare un servizio di comunicazione anonimo in grado di tutelare la privacy di chi naviga sfruttando i nodi del suo circuito.

    Ovviamente dobbiamo installare il programma Tor, potete trovarlo a questo indirizzo: torproject.org.

    Dobbiamo anche avere installato la liberia Requests ed una libreria accessoria chiamata pysocks, basta semplicemente utilizzare pip:

    pip install requests
    pip install pysocks

    Per dimostrare il funzionamento andiamo ad usare come servizio verifica del nostro IP il sito httpbin.org. Questo site permette di effettuare vari test con le chiamate HTTP.

    Nel nostro caso andiamo a verificare l’indirizo IP che usiamo per navigare andano a fare una richiesta get all’indirizzo: ‘http://httpbin.org/ip‘.

    import requests
    page = requests.get('http://httpbin.org/ip')
    ip = page.text
    print(ip)

    Otteniamo come risultato in nostro ip, nel mio caso il seguente:
    {
    "origin": "93.35.165.226, 93.35.165.226"
    }

    Per utilizzare Tor come proxy per le nostre chiamate dobbiamo creare una sessione con Request, impostare il parametro proxies per poi procedere come abbiamo fatto nella chiamata precedente:

    session = requests.session()
    session.proxies = {'http':'socks5://127.0.0.1:9150',
    'https': 'socks5://127.0.0.1:9150'}
    anonymous_request = session.get('http://httpbin.org/ip')
    print(anonymous_request.text)

    Otteniamo come risultato quello dell'ultimo nodo del circuito Tor che stiamo usando:

    {
    "origin": "209.141.61.45, 209.141.61.45"
    }

    I proxies che andiamo ad impostare, per le chiamate HTTP ed HTTPS, vanno a puntare alla porta 9150 che è quella impostata nella nostra macchina (localhost = 127.0.0.1) per le chiamante al servizio di Tor.

    Di seguito vi riporto il codice completo dello script ed il link per scaricarlo da GitHub.

    import requests
    # Chiamata in chiaro
    simple_request = requests.get('http://httpbin.org/ip')
    response = simple_request.json()
    print(f"Questo è il mio indirizzo in chiaro:{response['origin']}")

    # Chiamata usando Tor
    session = requests.session()
    session.proxies = {'http': 'socks5://127.0.0.1:9150',
    'https':'socks5://127.0.0.1:9150'}
    anonymous_request = session.get('http://httpbin.org/ip')
    response = anonymous_request.json()
    print(f"Questo è il mio indirizzo mascherato:{response['origin']}")

    Dato che il sito che interroghiamo ci risponde con dei dati in formato JSON abbiamo fatto alcune modifiche ed abbiamo usato la funzione json() per formattare i dati ricevuti.