Så här skrapar du webbsidor för metadata

Vad du ska skapa

Introduktion

Nyligen började jag bygga en community-plats ovanpå Yii-plattformen, som jag ska skriva om snart som en del av min programmering med Yii2-serien. Jag ville göra det enkelt att lägga till länkar relaterade till innehåll på webbplatsen. Även om det är lätt för människor att klistra in webbadresser i formulär, blir det tidskrävande att även tillhandahålla titel- och källinformation.

I dagens handledning kommer jag att visa dig hur du kan utnyttja PHP för att skrapa vanliga metadata från webbsidor för att göra det enklare för dina användare att delta och bygga mer intressanta tjänster.

Kom ihåg att jag deltar i kommentarspreadema nedan, så berätta vad du tycker! Du kan också nå mig på Twitter @lookahead_io. 

Komma igång

Först byggde jag en form för att människor skulle lägga till länkar genom att klistra in webbadressen. Jag skapade också en Slå upp knappen för att använda AJAX för att begära att webbsidan skrapas för metadatainformation.

Brådskande Slå upp kallar Länk :: grab () funktion via ajax:

$ (dokument) .on ("klicka", "[id = uppslag]", funktion (händelse) $ .ajax (url: $ ('# url_prefix') .val () + '/ link / grab' data: url: $ ('# url') .val (), framgång: funktion (data) $ ('# title') .val (data); returnera true;);); 

Skrapning av sidan

De Länk :: grab () kodsamtal fetch_og (). Detta efterliknar en sökrobot för att fånga sidan och få metadata med DOMXPath:

offentlig statisk funktion 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 = nytt \ DomDocument; @ $ Dom-> loadHTML ($ data); $ xpath = new \ DOMXPath ($ dom); # fråga metataggar med och prefix $ metas = $ xpath-> fråga ('// * / meta [starts-with (@property, \' och: \ ')]'); $ och = array (); foreach ($ metas som $ meta) # få fastighetsnamn utan och: prefix $ property = str_replace ('och:', ', $ meta-> getAttribute (' property ')); $ content = $ meta-> getAttribute "innehåll"); $ och [$ property] = $ content; returnera $ och;

För mitt scenario har jag ersatt og: taggar ovan, men koden nedan söker efter olika typer av taggar:

$ tags = Länk :: fetch_og ($ url); om (isset ($ tags ['title'])) $ title = $ tags ['title'];  annars om (isset ($ tags ['metaProperties'] ['och: title'] ['value'])) $ title = $ tags ['metaProperties'] ['och: title'] ['value'] ;  annat $ title = 'n / a';  returnera $ title; 

Du kan också ta tag i andra taggar som nyckelord, beskrivning etc. JQuery lägger sedan till resultatet till formuläret för användaren att skicka in:

Går längre

Jag har också en tabell med källor som jag kommer att utveckla mer senare. Men i princip, varje gång en ny webbadress läggs till, analyserar vi den för baswebbplatsen och placerar den i en Källa tabell:

$ model-> source_id = Källa :: lägg till ($ model-> url); ... offentliga statiska funktion lägg till ($ url = ", $ name =") $ source_url = parse_url ($ url); $ url = $ source_url ['värd']; $ url = trim ($ url, '\\'); $ s = Källa :: hitta () -> var (['url' => $ url]) -> ett (); om (is_null ($ s)) $ s = ny källa; $ s-> url = $ url; $ s-> namn = $ namn; $ s-> status = Källa :: STATUS_ACTIVE; $ S-> Spara ();  annat om ($ s-> namn == ") $ s-> namn = $ namn; $ s-> uppdatering (); returnera $ s-> id;

För närvarande uppdaterar jag manuellt namn på källor så att de ser rena ut för användaren, t.ex.. ABC News, BoingBoing, och Vice:

Förhoppningsvis, i ett kommande avsnitt, ska jag granska hur man använder fritt tillgängliga API för att leta upp webbplatsens namn. Det är konstigt för mig att det inte finns någon vanlig metatag för detta; om bara Internet var perfekt.

Paywall-platser

Några webbplatser som The New York Times låter dig inte skrapa metadata på grund av sina betalningsmöjligheter. Men de har ett API. Det är inte lätt att lära sig på grund av den förvirrande dokumentationen, men deras utvecklare är snabba att hjälpa till på GitHub. Jag hoppas också att skriva om att använda metadatasökning för New York Times-titlar i ett framtida avsnitt.

I stängning

Jag hoppas att du hittade den här skrapningsguiden till hjälp och låt den använda någonstans i dina projekt. Om du vill se det i åtgärd kan du prova några av webbskrapningen på min sida, Active Together.

Vänligen dela alla tankar och feedback i kommentarerna. Du kan också alltid nå mig på Twitter @lookahead_io direkt. Och se till att kolla in min instruktörssida och min andra serie, Bygg din start med PHP och programmering med Yii2.

relaterade länkar

  • Så här skrapar du webbsidor med Node.js och jQuery (Envato Tuts +)
  • Metataggar och SEO (Envato Tuts +)
  • Uppgradera din Linux Server till PHP 7 (Envato Tuts +)