Slik skraver du websider for metadata

Hva du skal skape

Introduksjon

Nylig begynte jeg å bygge et fellesskapsside på toppen av Yii-plattformen, som jeg skal skrive om snart som en del av min programmering med Yii2-serien. Jeg ønsket å gjøre det enkelt å legge til lenker relatert til innhold på nettstedet. Mens det er enkelt for folk å lime inn nettadresser i skjemaer, blir det tidkrevende å også gi tittel og kildeinformasjon.

I dagens veiledning skal jeg vise deg hvordan du kan utnytte PHP til å skrape vanlige metadata fra nettsider for å gjøre det lettere for brukerne å delta og å bygge flere interessante tjenester.

Husk at jeg deltar i kommentarene nedenfor, så fortell meg hva du synes! Du kan også nå meg på Twitter @lookahead_io. 

Starter

Først bygde jeg et skjema for folk å legge til linker ved å lime inn nettadressen. Jeg har også laget en Se opp knappen for å bruke AJAX for å be om at nettsiden skal skrapes for metadatainformasjon.

Pressing Se opp kaller Link :: grip () funksjon via ajax:

$ (dokument) .on ("klikk", "[id = oppslag]", funksjon (hendelse) $ .ajax (url: $ ('# url_prefix') .val () + '/ link / grab' data: url: $ ('# url') .val (), suksess: funksjon (data) $ ('# tittel') .val (data); return true;);); 

Skraping av siden

De Link :: grip () kodeanrop fetch_og (). Dette etterligner en crawler for å fange opp siden og få metadataene med DOMXPath:

offentlig statisk funksjon fetch_og ($ url) $ options = array ('http' => array ('user_agent' => 'facebookexternalhit / 1.1')); $ context = stream_context_create ($ options); $ data = file_get_contents ($ url, false, $ kontekst); $ dom = nytt \ DomDocument; @ $ Dom-> loadHTML ($ data); $ xpath = new \ DOMXPath ($ dom); # spørre metatags med og prefiks $ metas = $ xpath-> spørring ('// * / meta [starter-med (@property, \' og: \ ')]'); $ og = array (); foreach ($ metas som $ meta) # få eiendomsnavn uten og: prefiks $ property = str_replace ('og:', ', $ meta-> getAttribute (' property ')); $ content = $ meta-> getAttribute 'innhold'); $ og [$ property] = $ content; returnere $ og;

For mitt scenario har jeg erstattet og: koder over, men koden under ser etter ulike typer koder:

$ tags = Link :: fetch_og ($ url); hvis (isset ($ tags ['title'])) $ title = $ tags ['title'];  andre hvis (isset ($ tags ['metaProperties'] ['og: title'] ['value'])) $ title = $ tags ['metaProperties'] ['og: title'] ['value'] ;  ellers $ title = 'n / a';  returner $ title; 

Du kan også hente andre tagger som søkeord, beskrivelse, etc. JQuery legger deretter resultatet til skjemaet for brukeren å sende inn:

Gå videre

Jeg har også et kildeskema som jeg skal utvikle senere. Men i utgangspunktet, hver gang en ny nettadresse legges til, analyserer vi den for domenet til webområdet og legger det i en Kilde bord:

$ model-> source_id = Kilde :: add ($ model-> url); ... offentlig statisk funksjon legg til ($ url = ", $ name =") $ source_url = parse_url ($ url); $ url = $ source_url ['vert']; $ url = trim ($ url, '\\'); $ s = Kilde :: finn () -> hvor (['url' => $ url]) -> en (); hvis (is_null ($ s)) $ s = ny kilde; $ s-> url = $ url; $ s-> navn = $ navn; $ s-> status = Kilde :: STATUS_ACTIVE; $ S-> Lagre ();  annet hvis ($ s-> navn == ") $ s-> navn = $ navn; $ s-> oppdatering (); returnere $ s-> id;

For nå oppdaterer jeg manuelt navnene på kildene, slik at de blir rene for brukeren, f.eks. ABC News, Boingboing, og vice:

Forhåpentligvis, i en kommende episode, vil jeg vurdere hvordan du bruker fritt tilgjengelige APIer for å slå opp nettstedets navn. Det er merkelig for meg at det ikke er noe vanlig metatag for dette; hvis bare Internett var perfekt.

Paywall-områder

Noen steder som The New York Times, lar deg ikke skrape metadataene på grunn av deres betalingsveier. Men de har en API. Det er ikke lett å lære på grunn av den forvirrende dokumentasjonen, men utviklerne er raske til å hjelpe på GitHub. Jeg håper også å skrive om bruk av metadataoppslaget for New York Times-titlene i en fremtidig episode.

I Avslutning

Jeg håper du fant denne skrapehåndboken nyttig og la den bruke et sted i prosjektene dine. Hvis du vil se det i aksjon, kan du prøve ut noe av nettskrapingen på nettstedet mitt, Active Together.

Vennligst gjør noen tanker og tilbakemeldinger i kommentarene. Du kan også alltid nå meg på Twitter @lookahead_io direkte. Og vær sikker på å sjekke ut min instruktørside og min andre serie, Bygg opp oppstarten med PHP og programmering med Yii2.

Relaterte linker

  • Slik skraver du websider med Node.js og jQuery (Envato Tuts +)
  • Meta Tags og SEO (Envato Tuts +)
  • Oppgradering av Linux Server til PHP 7 (Envato Tuts +)