Vorige week schreef ik een inleiding over het scrapen van webpagina's om metadata te verzamelen, met de vermelding dat het niet mogelijk is om de New York Times-site te schrapen. The Times paywall blokkeert je pogingen om elementaire metadata te verzamelen. Maar er is een manier om dit te doen met behulp van de New York Times API.
Onlangs begon ik met het bouwen van een community-site bovenop het Yii-platform, dat ik in een toekomstige tutorial heb gepubliceerd. 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.
Dus in de tutorial van vandaag ga ik de scraping-code uitbreiden die ik recent heb geschreven om de New York Times-API te gebruiken om nieuws te verzamelen wanneer Times-links worden toegevoegd.
Vergeet niet dat ik deelneem aan de onderstaande opmerkingen, dus vertel me wat je denkt! Je kunt me ook bereiken op Twitter @lookahead_io.
Laten we ons eerst aanmelden om een API-sleutel aan te vragen:
Nadat u het formulier heeft verzonden, ontvangt u uw sleutel per e-mail:
The Times biedt API's in de volgende categorieën:
Het is veel. En, vanaf de pagina Galerij, kunt u op een onderwerp klikken om de documentatie over de afzonderlijke API-categorie te bekijken:
The Times gebruikt LucyBot om hun API-documenten aan te zetten, en er is een nuttige FAQ:
Ze laten u zelfs zien hoe u snel uw limieten voor API-gebruik kunt halen (u moet uw sleutel inpluggen):
krul - hoofd https://api.nytimes.com/svc/books/v3/lists/overview.json?api-key=2> / dev / null | grep -i "X-RateLimit" X-RateLimit-Limit-day: 1000 X-RateLimit-Limit-second: 5 X-RateLimit-Remaining-dag: 180 X-RateLimit-Remaining-second: 5
Ik had aanvankelijk moeite om de documentatie te begrijpen - het is een parametergebaseerde specificatie, geen programmeergids. Ik plaatste enkele vragen echter als problemen voor de API GitHub-pagina van de New York Times en ze werden snel en nuttig beantwoord.
Voor de aflevering van vandaag ga ik me concentreren op het gebruik van de NY Times-artikelzoekopdracht. Kortom, we breiden het Maak een link formulier uit de laatste tutorial:
Wanneer de gebruiker klikt Opzoeken, we zullen een ajax-aanvraag doen tot en met Link :: grab ($ url)
. Dit is het jQuery:
$ (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;););
Hier is de controller en modelmethode:
// Controller-oproep via AJAX Lookup-aanvraag openbare statische functie actionGrab ($ url) Yii :: $ app-> response-> format = Response :: FORMAT_JSON; terug Link :: grab ($ url); ... // Link :: grab () methode public static function grab ($ url) // opschonen url voor hostnaam $ source_url = parse_url ($ url); $ source_url = $ source_url ['host']; $ source_url = str_ireplace ('www.', ", $ source_url); $ source_url = trim ($ source_url, '\\'); // gebruik de NYT API als hostnaam == nytimes.com if ($ source_url == ' nytimes.com ') ...
Laten we vervolgens onze API-sleutel gebruiken om een artikelzoekaanvraag te doen:
$ NytKey = Yii :: $ app-> params [ 'nytapi']; $ curl_dest = 'http://api.nytimes.com /svc/search/v2/articlesearch.json?fl=headline&fq=web_url:%22'. $ Url '% 22 & api-key =' $ nytKey..; $ curl = curl_init (); curl_setopt ($ curl, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ curl, CURLOPT_URL, $ curl_dest); $ result = json_decode (curl_exec ($ curl)); $ title = $ result-> response-> docs [0] -> headline-> main; else // niet NYT, gebruik de standaard metatagschraper uit de laatste aflevering ... return $ title;
En het werkt vrij gemakkelijk - hier is de resulterende kop (trouwens, de klimaatverandering is het doden van ijsberen en dat zouden we moeten schelen):
Als u meer details van uw API-aanvraag wilt, voegt u gewoon extra argumenten toe aan de ?fl = headline
verzoek zoals trefwoorden
en lead_paragraph
:
Yii :: $ app-> response-> format = Response :: FORMAT_JSON; $ NytKey = Yii :: $ app-> params [ 'nytapi']; $ curl_dest = 'http://api.nytimes.com/svc/search/v2/articlesearch.json?'. 'Fl = headline, trefwoorden, lead_paragraph & FQ = internet_url:% 22' $ url '% 22 & api-key =' $ nytKey;... $ curl = curl_init (); curl_setopt ($ curl, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ curl, CURLOPT_URL, $ curl_dest); $ result = json_decode (curl_exec ($ curl)); var_dump ($ result);
Dit is het resultaat:
Misschien zal ik een PHP-bibliotheek schrijven om de NYT API beter te parsen in komende afleveringen, maar deze code breekt de sleutelwoorden en de hoofdparagraaf uit:
Yii :: $ app-> response-> format = Response :: FORMAT_JSON; $ NytKey = Yii :: $ app-> params [ 'nytapi']; $ curl_dest = 'http://api.nytimes.com/svc/search/v2/articlesearch.json?'. 'Fl = headline, trefwoorden, lead_paragraph & FQ = internet_url:% 22' $ url '% 22 & api-key =' $ nytKey;... $ curl = curl_init (); curl_setopt ($ curl, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ curl, CURLOPT_URL, $ curl_dest); $ result = json_decode (curl_exec ($ curl)); echo $ result-> response-> docs [0] -> headline-> main. '
''
'; echo $ result-> response-> docs [0] -> lead_paragraph. '
''
'; foreach ($ result-> response-> docs [0] -> keywords als $ k) echo $ k-> waarde. '
';
Dit is wat het voor dit artikel laat zien:
Het pad van ijsberen om te dalen loopt door Alaskan Village De beren die hier komen zijn klimaatvluchtelingen, op het land omdat het zeeijs waarop ze zich verlaten voor het jagen op zeehonden terugwijkt. Polar Bears Broeikasgasemissies Alaska Global Warming Bedreigde en uitgestorven soorten Internationale Unie voor natuurbescherming Nationaal Sneeuw- en IJsdatacentrum IJsbeer Internationaal Verenigde Staten Geologisch onderzoek
Hopelijk begint dat je verbeeldingskracht te vergroten over het gebruik van deze API's. Het is best spannend wat nu mogelijk is.
De New York Times API is erg handig en ik ben blij dat ze de community van ontwikkelaars hebben aangeboden. Het was ook verfrissend om zo'n snelle API-ondersteuning te krijgen via GitHub-ik had dit gewoon niet verwacht. Houd er rekening mee dat het is bedoeld voor niet-commerciële projecten. Als je een idee hebt om geld te verdienen, stuur ze dan een briefje om te kijken of ze met je kunnen werken. Uitgevers willen graag nieuwe bronnen van inkomsten.
Ik hoop dat je deze webschraping-afleveringen nuttig vindt en ze in je projecten kunt gebruiken. Als je de aflevering van vandaag in actie wilt zien, kun je enkele van de webscraping op mijn site proberen uit te proberen, samen actief.
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 andere series te bekijken, Building Your Startup With PHP en Programming With Yii2.