Come raschiare le pagine Web per i metadati

Cosa starai creando

introduzione

Recentemente ho iniziato a costruire un sito di community sulla piattaforma Yii, di cui scriverò presto come parte della mia serie Programming With Yii2. Volevo semplificare l'aggiunta di link relativi ai contenuti del sito. Mentre è facile per le persone incollare gli URL nei moduli, diventa anche molto tempo fornire informazioni sul titolo e sulla fonte.

Nel tutorial di oggi, ti mostrerò come utilizzare PHP per scansionare i metadati comuni dalle pagine web per facilitare la partecipazione dei tuoi utenti e creare servizi più interessanti.

Ricorda, parteciperò ai thread dei commenti qui sotto, quindi dimmi cosa ne pensi! Puoi raggiungermi anche su Twitter @lookahead_io. 

Iniziare

Innanzitutto, ho creato un modulo per consentire alle persone di aggiungere collegamenti incollando l'URL. Ho anche creato un Consultare pulsante per utilizzare AJAX per richiedere la raschiatura della pagina Web per le informazioni sui metadati.

urgente Consultare chiama il Collegamento :: Grab () funzione tramite ajax:

$ (document) .on ("click", "[id = lookup]", function (event) $ .ajax (url: $ ('# url_prefix'). val () + '/ link / grab', data: url: $ ('# url'). val (), success: function (data) $ ('# title'). val (data); return true;);); 

Raschiare la pagina

Il Collegamento :: Grab () chiamate di codice fetch_og (). Questo imita un crawler per catturare la pagina e ottenere i metadati con DOMXPath:

funzione statica pubblica fetch_og ($ url) $ options = array ('http' => array ('user_agent' => 'facebookexternalhit / 1.1')); $ context = stream_context_create ($ options); $ data = file_get_contents ($ url, false, $ context); $ dom = new \ DomDocument; @ $ Dom-> loadHTML (dati $); $ xpath = new \ DOMXPath ($ dom); # query metatags with og prefix $ metas = $ xpath-> query ('// * / meta [inizia con (@property, \' og: \ ')]'); $ og = array (); foreach ($ metas as $ meta) # ottiene il nome della proprietà senza og: prefix $ property = str_replace ('og:', ", $ meta-> getAttribute ('proprietà')); $ content = $ meta-> getAttribute ( 'contenuto'); $ og [$ proprietà] = $ contenuto; ritorno $ og;

Per il mio scenario, ho sostituito il og: tag sopra, ma il codice seguente cerca vari tipi di tag:

$ tags = Link :: fetch_og ($ url); if (isset ($ tags ['title'])) $ title = $ tags ['title'];  else if (isset ($ tags ['metaProperties'] ['og: title'] ['value'])) $ title = $ tags ['metaProperties'] ['og: title'] ['valore'] ;  else $ title = 'n / a';  return $ title; 

Puoi anche prendere altri tag come parole chiave, descrizione, ecc. Il jQuery aggiunge quindi il risultato al modulo per l'invio da parte dell'utente:

Andare avanti

Ho anche una tabella di fonti che svilupperò più avanti. In pratica, ogni volta che viene aggiunto un nuovo URL, lo analizziamo per il dominio del sito Web di base e lo inseriamo in a fonte tavolo:

$ model-> source_id = Source :: add ($ model-> url); ... public static function add ($ url = ", $ name =") $ source_url = parse_url ($ url); $ url = $ source_url ['host']; $ url = trim ($ url, '\\'); $ s = Source :: find () -> where (['url' => $ url]) -> one (); if (is_null ($ s)) $ s = new Source; $ s-> url = $ url; $ s-> nome = $ nome; $ s-> status = Source :: STATUS_ACTIVE; $ S-> save ();  else if ($ s-> nome == ") $ s-> nome = $ nome; $ s-> update (); restituisce $ s-> id;

Per ora, sto aggiornando manualmente i nomi delle fonti in modo che sembrino pulite all'utente, ad es. Notizie ABC, BoingBoing, e Vice:

Spero che in un episodio imminente rivedrò come utilizzare le API disponibili gratuitamente per cercare il nome del sito. È strano per me che non ci sia un metatag comune per questo; se solo Internet fosse perfetto.

Siti Paywall

Alcuni siti come il New York Times non ti permettono di grattare i metadati a causa dei loro paywall. Ma hanno un'API. Non è facile da imparare a causa della documentazione confusa, ma i loro sviluppatori sono pronti ad aiutare su GitHub. Spero anche di scrivere sull'uso della ricerca di metadati per i titoli del New York Times in un episodio futuro.

In chiusura

Spero che questa guida per lo scraping sia stata utile e che la utilizzi da qualche parte nei tuoi progetti. Se desideri vederlo in azione, puoi provare alcuni degli scrap di web sul mio sito, Active Together.

Si prega di condividere eventuali pensieri e feedback nei commenti. Puoi sempre contattarmi direttamente su Twitter @lookahead_io. E assicurati di controllare la mia pagina di istruttore e le mie altre serie, Crea il tuo avvio con PHP e Programmazione con Yii2.

Link correlati

  • Come raschiare le pagine Web con Node.js e jQuery (Envato Tuts +)
  • Meta Tag e SEO (Envato Tuts +)
  • Aggiornamento del tuo server Linux a PHP 7 (Envato Tuts +)