Hoe webpagina's voor metadata schrapen

Wat je gaat creëren

Invoering

Onlangs begon ik met het bouwen van een community-site bovenop het Yii-platform, waarover ik binnenkort ga schrijven als onderdeel van mijn Programming With Yii2-serie. Ik wilde het gemakkelijk maken om links toe te voegen die gerelateerd zijn aan de inhoud van de site. Hoewel het voor mensen eenvoudig is om URL's in formulieren te plakken, wordt het tijdrovend om ook titel- en broninformatie te bieden.

In de tutorial van vandaag laat ik je zien hoe je PHP kunt gebruiken om algemene metadata van webpagina's te schrapen, zodat het voor je gebruikers gemakkelijker wordt om deel te nemen en interessantere services te bouwen.

Vergeet niet dat ik deelneem aan de onderstaande opmerkingen, dus vertel me wat je denkt! Je kunt me ook bereiken op Twitter @lookahead_io. 

Ermee beginnen

Ten eerste heb ik een formulier voor mensen gemaakt om links toe te voegen door de URL te plakken. Ik heb ook een gemaakt Opzoeken om AJAX te gebruiken om de webpagina aan te vragen voor metadata-informatie.

persing Opzoeken roept de Link :: grab () functie via ajax:

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

De pagina schrapen

De Link :: grab () code oproepen fetch_og (). Dit imiteert een crawler om de pagina vast te leggen en de metadata te krijgen met DOMXPath:

openbare statische functie 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 ($ data); $ xpath = new \ DOMXPath ($ dom); # query metatags met og prefix $ metas = $ xpath-> query ('// * / meta [starts-with (@property, \' og: \ ')]'); $ og = array (); foreach ($ metas als $ meta) # krijg eigenschapnaam zonder og: prefix $ property = str_replace ('og:', ", $ meta-> getAttribute ('property')); $ content = $ meta-> getAttribute ( 'content'); $ og [$ property] = $ content; return $ og;

Voor mijn scenario heb ik de vervangen og: tags hierboven, maar de onderstaande code zoekt naar verschillende soorten tags:

$ 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'] ['value'] ;  else $ title = 'n / a';  return $ title; 

U kunt ook andere tags zoals trefwoorden, een beschrijving, enz. Pakken. De jQuery voegt vervolgens het resultaat toe aan het formulier dat de gebruiker moet indienen:

Verder gaan

Ik heb ook een tabel met bronnen die ik later zal ontwikkelen. Maar eigenlijk wordt elke keer dat een nieuwe URL wordt toegevoegd, deze geparseerd voor het basissitedomein en plaatst deze in een Bron tafel:

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

Voor nu ben ik de namen van bronnen handmatig aan het updaten, zodat ze er schoon uitzien voor de gebruiker, bijvoorbeeld. ABC nieuws, Boing Boing, en Ondeugd:

Hopelijk zal ik in een komende aflevering bekijken hoe vrij beschikbare API's kunnen worden gebruikt om de naam van de site op te zoeken. Het is vreemd voor mij dat er geen gebruikelijke metatag voor is; als alleen internet perfect was.

Paywall-sites

Sommige sites zoals The New York Times laten je de metadata niet schrapen vanwege hun paywalls. Maar ze hebben wel een API. Het is niet gemakkelijk om te leren vanwege de verwarrende documentatie, maar hun ontwikkelaars helpen snel met GitHub. Ik hoop ook te schrijven over het gebruik van de metadata-lookup voor New York Times-titels in een toekomstige aflevering.

In Closing

Ik hoop dat je deze schraapgids nuttig hebt gevonden en deze ergens in je projecten hebt gebruikt. Als u het in actie wilt zien, kunt u enkele van de webscraping op mijn site proberen uit te proberen: Actief samen.

Deel alstublieft alle gedachten en feedback in de opmerkingen. Je kunt me ook altijd rechtstreeks op Twitter @lookahead_io bereiken. En vergeet niet om mijn instructeurspagina en mijn andere series te bekijken, Bouw je Startup met PHP en Programmeren met Yii2.

Gerelateerde Links

  • Hoe webpagina's te schrapen met Node.js en jQuery (Envato Tuts +)
  • Meta-tags en SEO (Envato Tuts +)
  • Uw Linux Server upgraden naar PHP 7 (Envato Tuts +)