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.
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;););
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:
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.
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.
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.