Browse Category by Guide
Guide

Come Realizzare Crawler da PHP-CLI

Oggi vi voglio parlare di Crawler scritti in PHP, anche se in un articolo precedente ho già affrontato questo argomento.
Partiamo dall’esigenza che mi ha spinto a costruire questo piccolo spider in php: devo popolare nella cache le pagine del mio sito…
Soluzione intrapresa: leggo tutte le pagine (o meglio tutti gli url all’interno del mio dominio) in un momento di basso traffico (la notte).

Il primo problema da affrontare è stato l’esecuzione di script php da riga di comando, come fare?.

In Php è possibile eseguire tutti gli script normalmente eseguiti da apache e php anche a riga di comando tramite PHP CLI.

L’acronimo CLI è l’abbreviazione di Command Line Interface (‘Interfaccia da Linea di Comando’), una modalità di accesso al sistema attraverso un interprete per comandi testuali; questi comandi sono espressi essenzialmente attraverso delle stringhe alfanumeriche che possono essere eseguite da altre applicazioni.

Nel caso di PHP, per esempio, sarà possibile utilizzare le CLI per integrare determinati programmi con funzionalità messe a disposizione da questo linguaggio.

Le differenze tra il tradizionale sviluppo di pagine Web e l’utilizzo di PHP tramite interfaccia testuale non sono poche, è possibile però elencarne le principali:

l’output generato tramite CLI è “pulito” (di default non vengono introdotti degli headers), l’utilizzatore lo vede esattamente così com’è cioè nel modo in cui viene prodotto;
l’output presenta una formattazione minima se non assente, il formato in “semplice testo” permette una più semplice elaborazione da parte di programmi di terze parti;
il tempo di esecuzione dei comandi è solitamente molto più veloce di quello richiesto nel caso in cui debba essere caricata una pagina Web;
l’utilizzatore può agire dall’interno dello spazio fisico dedicato a PHP nel file system;
gli input vengono gestiti a livello di runtime e cioè nel momento in cui un programma viene eseguito, cosa non possibile per le pagine Web dove la definizione degli input precede l’esecuzione dello script.
In molti potrebbero chiedersi come mai si è sentita l’esigenza di integrare in PHP la possibilità di inviare istruzioni tramite linea di comando, esistono infatti linguaggi molto più collaudati come per esempio Perl grazie ai quali interagire con il sistema. L’obiezione è sensata, ma nello stesso tempo è necessario elencare i vantaggi derivanti dall’introduzione della CLI in questo linguaggio:

non è necessario imparare altri linguaggi come appunto Perl, Bash o Awk;
consente di riutilizzare componenti e codici preesistenti;
mette a disposizione uno strumento per sfruttare al meglio il multithreading in PHP5;
permette di integrare nuove funzionalità in applicazioni PHP preesistenti;
introduce la possibilità di automatizzare e programmare (CRON) i processi, cosa impossibile tramite il tradizionale sviluppo limitato alle pagine Web;
consente di creare interfacce grafiche (GUI) utilizzando PHP e GTK.
Se volete maggiori dettagli su PHP Cli potete vedere questo tutorial in inglese.

Data questa piccola introduzione a PHP CLI vediamo in dettaglio come costruire l’algoritmo di ricerca delle pagine del Crawler. L’idea è quella di usare una struttura dati ti tipo Coda FIFO (FIFO Queue), dove memorizzare tutti gli url del sito mano a mano che vengono reperiti.

Recupero gli url dalla home page del sito e li salvo nella coda (urls).

Setto il contatore di avanzamento a zero (index=0).

Prendo l’url i-esimo nella coda (urls[index]) dalla coda e lo leggo la pagina ricavando nuovi url.

Salvo gli url nella coda se appartengono al dominio del sito e se non sono già presenti nella coda.

Incremento il contatore di avanzamento (index++).

Riprendi l’url i-esimo nella coda (urls[index]) dalla coda e leggo la pagina ricavando nuovi url.

Proseguo finchè il contatore è minore della dimensione della coda (index < count(urls) -1).
Cosi facendo sono sicuro di processare tutti gli url presenti nel sito.
Vediamo l’implementazione del crawler in PHP:

/*
Script Name: Crawler.php
Description: Un semplice crawler in php per la lettura di tutte le pagine di un sito da lanciare da PHP CLI
Autore: Gianluca Moroni http://www.gianjey.it
Autore URI: http://www.programmandofacile.it
Version: 1.0
*/

function LeggiUrls($urlPagina,$urlDominio,&$queue) {
$result = file_get_contents($urlPagina);
// Se ho scaricato qualcosa
if( $result )
{
// Cerco gli href sulla pagina
preg_match_all( ‘/<a.+?href=”(http:\/\/www.[^0-9].+?)”/’, $result, $output, PREG_SET_ORDER );

// Ciclo tutti i risultati e verifico se gli url sono nel dominio del sito
// e li aggiungo alla coda se non erano già presenti
foreach( $output as $item )
{
//print_r($item[1]);
$host = parse_url($item[1], PHP_URL_HOST);
if($host == $urlDominio) {
if (!in_array($item[1], $queue)) {
array_push($queue,$item[1]);
}
}
}
}
}

// La coda che contiene gli url
$queue = array();

// Leggo il sito dallo riga di comando, deve avere http:// davanti al dominio
$urlSito = $_SERVER[“argv”][1];
$host = parse_url($urlSito, PHP_URL_HOST);

// Variabile per ritardare le chiamate
// se non passata da riga di comando viene settata ad un secondo
$DELAY = 1;

if(isset($_SERVER[“argv”][2])) {
$DELAY = $_SERVER[“argv”][2];
}

// Leggo gli url della prima pagina e li aggiungo alla coda
LeggiUrls($urlSito,$host,$queue);

$index=0;

// Ciclo e recupero tutte le pagine nella coda lanciando
// la funzione che mi cerca gli url e li aggiunge alla coda
// se nel dominio e se non presenti nella coda
while($index < count($queue)-1) { LeggiUrls($queue[$index],$host,$queue); $index++; sleep($DELAY); echo(“Pagina:” . $queue[$index] . “\n”); echo(“Index:” . $index . “\n”); echo(“Count:” .count($queue) . “\n”); } print_r(‘Finito’); ?>

Per lanciare lo script salvate la pagina in un file chiamato ad esempio “Crawler.php”, date i permessi di esecuzione se siete sotto Linux, e scrivete a riga di comando:

php Crawler.php http://www.sito.it 5
Cosi facendo lanciate lo spider verso http://www.sito.it con un intervallo di 5 secondi tra una chiamata e l’altra, ed ecco che il gioco e fatto, tutte le pagine del sito verranno lette e la cache verrà popolata.

Partendo da questo semplice esempio, e giocando un po con le regular expression potrete costruire crawler che recuperano tutto quello che vi serve.
Spero di essere stato chiaro nell’esposizione, se avete dubbi non esitate a contattarmi.

Guide

Strutture dati – Liste Concatenate

In informatica, una lista concatenata è una struttura dati costituita da un gruppo di nodi che insieme rappresentano una sequenza…

In quest’articolo vedremo la più semplice delle liste, la lista semplicemente concatenata. Esistono anche altri tipi di lista, le liste doppiamente concatenate, le liste circolari semplicemente concatenate e le liste circolari doppiamente concatenate ma per approfondimenti guardate pure wikipedia

Lista Concatenata

La lista semplicemente concatenata (Singly-linked List) è una lista di elementi in cui gli elementi possono essere posizionati ovunque nella memoria heap. Tutti gli elementi della lista sono collegati tra loro utilizzando un campo per memorizzare l’indirizzo del nodo successivo.
La lista semplicemente concatenata (Singly-linked List) ha una dimensione dinamica e può essere determinata solo a run-time e non in fase di compilazione.
L’immagine sopra mostra una Singly-linked List. Ci sono quattro elementi nella lista. Il puntatore “Head” è il puntatore che punta al primo elemento della lista.

Aggiunta di un nuovo elemento alla lista

 

L’algoritmo è semplice:

– Se la lista è vuota dobbiamo inserire un nuovo elemento (o nodo) come nodo di partenza.
– In caso contrario, si attraversa la lista esistente per ottenere il puntatore all’ultimo nodo;

Creiamo un nuovo nodo.
Cambiamo il puntatore successivo dell’ultimo nodo al nuovo nodo.
Il puntatore del prossimo nuovo nodo punterà a NULL e sarà l’ultimo nodo della lista.

Implementazione di una Lista Concatenata in C
#include
#include

struct node{
int data;
struct node *next;
};

struct node* add(struct node *head, int data){
struct node *tmp;

if(head == NULL){
head=(struct node *)malloc(sizeof(struct node));
if(head == NULL){
printf(“Error! memory is not available\n”);
exit(0);
}
head-> data = data;
head-> next = head;
}else{
tmp = head;

while (tmp-> next != head)
tmp = tmp-> next;
tmp-> next = (struct node *)malloc(sizeof(struct node));
if(tmp -> next == NULL)
{
printf(“Error! memory is not available\n”);
exit(0);
}
tmp = tmp-> next;
tmp-> data = data;
tmp-> next = head;
}
return head;
}

void printlist(struct node *head)
{
struct node *current;
current = head;
if(current!= NULL)
{
do
{
printf(“%d\t”,current->data);
current = current->next;
} while (current!= head);
printf(“\n”);
}
else
printf(“The list is empty\n”);

}

void destroy(struct node *head)
{
struct node *current, *tmp;

current = head->next;
head->next = NULL;
while(current != NULL) {
tmp = current->next;
free(current);
current = tmp;
}
}
void main()
{
struct node *head = NULL;
head = add(head,1); /* 1 */
printlist(head);

head = add(head,20);/* 20 */
printlist(head);

head = add(head,10);/* 1 20 10 */
printlist(head);

head = add(head,5); /* 1 20 10 5*/
printlist(head);

destroy(head);
getchar();
}

Guide

Come Raggruppare una Serie di Dati in Excel

Con Excel possiamo racchiudere e nascondere una serie di dati disposti su più righe. Tali dati potranno essere nuovamente espansi premendo un pulsante contrassegnato con il simbolo + (più). A tale scopo è necessario portarsi sul menu Dati, selezionare le celle da raggruppare, premere il tasto Raggruppa, scegliere Righe, Ok.

A questo punto se premiamo il tasto – (meno) che è apparso davanti alle intestazioni di riga, i valori che avevamo selezionato vengono compressi, se premiamo nuovamente il tasto, che ora ha assunto il simbolo +, torniamo ad espandere e vedere tali dati. Questa funzionalità di Excel è utile se vogliamo ad esempio nascondere i dati di un’operazione e lasciare visibile solo il totale, ma con la possibilità di poterli sempre visionare con la semplice pressione dell’apposito pulsante.

Il raggruppamento può essere effettuato non solo su un livello, ma su più sottolivelli. Espandendo un livello vedremo il relativo sottolivello. Se abbiamo la necessità di raggruppare dati disposti su più colonne e non su più righe, ci portiamo sul menu Dati, selezioniamo le celle disposte su più colonne, premiamo il tasto Raggruppa, poi Colonne, Ok. Il tasto meno che dovremo premere appare ora sulle intestazioni di colonna, e non di riga.

Se non abbiamo più bisogno di questa funzionalità, per separare definitivamente le righe o le colonne, basterà premere dal menu Dati il tasto Separa, dopo aver selezionato le righe o le colonne interessate, poi scegliere Righe o Colonne, infine tasto Ok.

Guide

Come Importare i Dati Esterni in Excel

Excel ci permette di importare dati da altri programmi del pacchetto Office, come Access e Word. Per importare i dati dal database Access, selezionare una cella vuota nel foglio Excel, menu Dati, Da Access, nella finestra Selezione origine dati selezionare il file di Access da importare scegliendolo dal riquadro Cerca in, e poi dall’interno della finestra, tasto Apri, Ok. Dalla finestra Importa dati premere Ok.

Se vogliamo che i dati di Excel vengano aggiornati automaticamente ad ogni modifica del file originario di Access connesso, dalla finestra Importa dati premere il tasto Proprietà, e scegliere se aggiornare automaticamente il file di Excel ad intervalli regolari oppure ad ogni apertura del file. Per importare i dati da un file di testo dobbiamo selezionare una cella vuota nel foglio Excel, menu Dati, Da testo, nella finestra Importa file di testo selezionare il file .txt da importare, Importa, scegliere se i dati sono delimitati da caratteri come virgole o a capo, oppure allineati in colonne e separati da spazi, tasto Avanti, scegliere il tipo di delimitatore e premere il tasto Fine, poi Ok. Risulta essere inoltre possibile importare dati da web e da altre origini come database SQL Server e Microsoft query.

Guide

Come Modificare le Impostazioni di Stampa in Excel

Per modificare le impostazioni del foglio di lavoro da stampare, menu Layout di pagina, Imposta pagina. Per modificare i margini, menu Layout di pagina, tasto Margini, Margini personalizzati…, digitare le misure desiderate, Ok.

Per cambiare l’orientamento del foglio dal menu Layout di pagina, Orientamento, infine scegliere Verticale o Orizzontale. Per cambiare formato e dimensioni della carta su cui stampare il documento, dal menu Layout di pagina, Dimensioni, Altre dimensioni foglio, nel menu a discesa Formato, scegliere il formato desiderato (il foglio predefinito è l’A4), Ok.

Prima di stampare, per essere certi che non vi siano errori ortografici, selezionare dal menu Revisione, Controllo ortografia e grammatica. Se Excel trova degli errori li segnala suggerendo anche i termini simili per sostituirli. A questo punto possiamo cambiare il termine errato, cambiarlo ogni volta che viene trovato nel documento (tasto Cambia tutto), ignorare, impostare la correzione automatica, aggiungere un termine al dizionario. Nella sua impostazione predefinita Excel non include nella stampa la griglia (cioè i riquadri attorno alle celle) e le intestazioni di righe e di colonne (la parte con i numeri di riga e le lettere delle colonne). Per modificare tale impostazione e includere la griglia nelle stampe, menu Layout di pagina e alla voce Griglia mettere il segno di spunta nella casella Visualizza, mentre per non visualizzarla, deselezionarlo.

Per includere nella stampa le intestazioni di righe e colonne, menu Layout di pagina, Intestazioni, spuntare Visualizza, per non includerle, deselezionare Visualizza. Con Excel è possibile riportare in ogni pagina stampata il titolo di riferimento di ogni riga o colonna di dati. Dal menu Layout di pagina premere il tastino accanto alla voce Opzioni del foglio. Si aprirà la finestra Imposta pagina su cui è attivata la scheda Foglio. Alla voce Stampa titoli selezionare la casella Righe da ripetere in alto o Colonne da ripetere a sinistra, selezionare la riga o la colonna che vogliamo che sia stampata all’inizio di ogni foglio come intestazione, tasto Ok.

Per avere un’intestazione o un piè di pagina, presenti in tutti i fogli del documento da stampare, menu Inserisci, Intestazione e piè di pagina. Per inserire o modificare intestazioni e piè di pagina basterà selezionare l’area dell’intestazione (l’area con la scritta “Fare clic per aggiungere un’intestazione”) o l’area del piè di pagina (con la scritta “Fare clic per aggiungere un piè di pagina”), a sinistra al centro o a destra, a seconda della posizione in cui le desideriamo allineare. Possiamo inserire nell’intestazione o nel piè di pagina elementi predefiniti come un numero di pagina (menu Progettazione, tasto Numero di pagina), il numero delle pagine complessive (tasto Numero di pagine), la data e l’ora (tasti Data corrente e Ora corrente), il percorso del file, il nome del file o della scheda, infine è anche possibile inserire un’immagine (tasto Immagine). Per uscire dalla modalità Intestazione e piè di pagina e tornare alla visualizzazione normale del foglio, menu Visualizza, Normale.

Intestazione e piè di pagina vengono visualizzati solo nell’Anteprima di stampa e nella stampa. Per aprire l’anteprima di stampa, Pulsante Office, Stampa, Anteprima di stampa. Per chiuderla e tornare alla visualizzazione normale, premere il tasto Chiudi anteprima di stampa. Nel menu Visualizza vi è l’opzione Anteprima interruzioni di pagina, che permette di visualizzare il documento prima della stampa e ciò che non rientra nelle dimensioni della pagina, contrassegnando il limite con una linea blu, e dando la possibilità di trascinare tale limite, per stampare su un singolo foglio comprendendo in esso tutto ciò che ci interessa. Ciò comporta logicamente una riduzione della scala di stampa, proporzionale all’aggiunta di nuove colonne all’area di stampa di un foglio. Per uscire dall’Anteprima interruzioni di pagina selezionare dal menu Visualizza, Normale. A questo punto anche con la visualizzazione normale apparirà una linea tratteggiata che delimita l’area stampabile.

Per stampare un documento Excel, Pulsante Office, Stampa, Stampa. Si aprirà la finestra di dialogo Stampa da cui si possono selezionare le opzioni. Nella casella Nome della voce Stampante possiamo scegliere la stampante da utilizzare, nella casella Numero di copie digitiamo il numero di copie da effettuare, nelle caselle Tutto, Pagine, Da:, A:, della voce Intervallo scegliere se stampare tutto il documento o solo pagine specifiche, nelle caselle Selezione, Fogli attivi, Tutta la cartella, scegliere se stampare rispettivamente la parte di foglio selezionata, il foglio attivo o tutto il documento, cioè tutti i fogli del file. Per stampare solo un grafico senza il foglio di lavoro, selezionarlo, Pulsante Office, Stampa, e scegliere dalla finestra, sotto la voce Stampa, l’opzione grafico selezionato. Per far partire la stampa premere infine il tasto Ok.