Accediendo a la imagen principal de la página de wikipedia por API

¿Hay alguna manera de que pueda acceder a la imagen en miniatura de cualquier página de wikipedia mediante el uso de una API? Me refiero a la imagen en el lado superior derecho de la caja. ¿Hay alguna API para eso?

http://en.wikipedia.org/w/api.php

Mira prop=images .

Devuelve una matriz de nombres de archivos de imágenes que se utilizan en la página analizada. A continuación, tiene la opción de hacer otra llamada a la API para encontrar la URL completa de la imagen, por ejemplo: action=query&titles=Image:INSERT_EXAMPLE_FILE_NAME_HERE.jpg&prop=imageinfo&iiprop=url

o para calcular la URL a través del hash del nombre del archivo .

Lamentablemente, aunque la matriz de imágenes devuelta por prop=images está en el orden en que se encuentran en la página, no se puede garantizar que la primera sea la imagen en el cuadro de información porque a veces una página incluirá una imagen antes del cuadro de información (la mayoría de los icons de tiempo para los metadatos sobre la página: por ejemplo, “este artículo está bloqueado”).

La búsqueda de la matriz de imágenes para la primera imagen que incluye el título de la página es probablemente la mejor suposición para la imagen del cuadro de información.

Puede obtener la miniatura de cualquier página de wikipedia utilizando prop=pageimages . Por ejemplo:

 http://en.wikipedia.org/w/api.php?action=query&titles=Al-Farabi&prop=pageimages&format=json&pithumbsize=100 

Y obtendrá la URL completa en miniatura.

Esta es una buena forma de obtener la imagen principal de una página en wikipedia

http://en.wikipedia.org/w/api.php?action=query&prop=pageimages&format=json&piprop=original&titles=India

Modo 1: puede intentar una consulta como esta:

http://en.wikipedia.org/w/api.php?action=opensearch&limit=5&format=xml&search=italy&namespace=0

en la respuesta, puede ver la etiqueta de la Image .

  Italy national rugby union team  The Italy national rugby union team represent the nation of Italy in the sport of rugby union.   http://en.wikipedia.org/wiki/Italy_national_rugby_union_team    

Modo 2: use la consulta http://en.wikipedia.org/w/index.php?action=render&title=italy

entonces puedes obtener un código html sin procesar, puedes hacer que la imagen use algo como PHP Simple HTML DOM Parser http://simplehtmldom.sourceforge.net

No tengo tiempo para escribelo. solo darte un consejo, gracias.

Lamento no haber respondido específicamente a tu pregunta sobre la imagen principal . Pero aquí hay un código para obtener una lista de todas las imágenes:

 function makeCall($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); return curl_exec($curl); } function wikipediaImageUrls($url) { $imageUrls = array(); $pathComponents = explode('/', parse_url($url, PHP_URL_PATH)); $pageTitle = array_pop($pathComponents); $imagesQuery = "http://en.wikipedia.org/w/api.php?action=query&titles={$pageTitle}&prop=images&format=json"; $jsonResponse = makeCall($imagesQuery); $response = json_decode($jsonResponse, true); $imagesKey = key($response['query']['pages']); foreach($response['query']['pages'][$imagesKey]['images'] as $imageArray) { if($imageArray['title'] != 'File:Commons-logo.svg' && $imageArray['title'] != 'File:P vip.svg') { $title = str_replace('File:', '', $imageArray['title']); $title = str_replace(' ', '_', $title); $imageUrlQuery = "http://en.wikipedia.org/w/api.php?action=query&titles=Image:{$title}&prop=imageinfo&iiprop=url&format=json"; $jsonUrlQuery = makeCall($imageUrlQuery); $urlResponse = json_decode($jsonUrlQuery, true); $imageKey = key($urlResponse['query']['pages']); $imageUrls[] = $urlResponse['query']['pages'][$imageKey]['imageinfo'][0]['url']; } } return $imageUrls; } print_r(wikipediaImageUrls('http://en.wikipedia.org/wiki/Saturn_%28mythology%29')); print_r(wikipediaImageUrls('http://en.wikipedia.org/wiki/Hans-Ulrich_Rudel')); 

Lo tengo para http://en.wikipedia.org/wiki/Saturn_%28mythology%29 :

 Array ( [0] => http://img.rephp.com/php/Arch_of_SeptimiusSeverus.jpg [1] => http://img.rephp.com/php/Ivan_Akimov_Saturn_.jpg [2] => http://img.rephp.com/php/Lucius_Appuleius_Saturninus.jpg [3] => http://img.rephp.com/php/Polidoro_da_Caravaggio_-_Saturnus-thumb.jpg [4] => http://img.rephp.com/php/Porta_Maggiore_Alatri.jpg [5] => http://img.rephp.com/php/She-wolf_suckles_Romulus_and_Remus.jpg [6] => http://img.rephp.com/php/Throne_of_Saturn_Louvre_Ma1662.jpg ) 

Y para la segunda URL ( http://en.wikipedia.org/wiki/Hans-Ulrich_Rudel ):

 Array ( [0] => http://img.rephp.com/php/BmRKEL.jpg [1] => http://img.rephp.com/php/BmRKELS.jpg [2] => http://img.rephp.com/php/Bundesarchiv_Bild_101I-655-5976-04,_Russland,_Sturzkampfbomber_Junkers_Ju_87_G.jpg [3] => http://upload.wikimedia.org/wikipedia/commons/6/62/Bundeswehr_Kreuz_Black.svg [4] => http://upload.wikimedia.org/wikipedia/commons/9/99/Flag_of_German_Reich_%281935%E2%80%931945%29.svg [5] => http://img.rephp.com/php/HansUlrichRudel.jpeg [6] => http://img.rephp.com/php/Heinkel_He_111_during_the_Battle_of_Britain.jpg [7] => http://img.rephp.com/php/Regulation_WW_II_Underwing_Balkenkreuz.png ) 

Tenga en cuenta que la URL cambió un poco en el 6º elemento de la segunda matriz. Es lo que @JosephJaber estaba advirtiendo en su comentario anterior.

Espero que esto ayude a alguien.

He escrito un código que obtiene la imagen principal (URL completa) por título del artículo de Wikipedia. No es perfecto, pero en general estoy muy satisfecho con los resultados.

El desafío fue que cuando se le preguntó por un título específico, Wikipedia devuelve múltiples nombres de archivo de imagen (sin ruta). Además, la búsqueda secundaria (utilicé el código varatis publicado en este hilo, ¡gracias!) Devuelve las URL de todas las imágenes encontradas en función del nombre de archivo de la imagen que se buscó, independientemente del título del artículo original. Después de todo esto, podemos terminar con una imagen genérica irrelevante para la búsqueda, por lo que filtramos. El código itera sobre los nombres de archivo y las URL hasta que encuentra (con suerte, la mejor) coincidencia … un poco complicado, pero funciona 🙂

Nota sobre el filtro genérico: he estado comstackndo una lista de cadenas de imágenes genéricas para la función isGeneric (), pero la lista sigue creciendo. Estoy considerando mantenerlo como una lista pública; si hay algún interés, háganmelo saber.

Pre:

 protected static $baseurl = "http://en.wikipedia.org/w/api.php"; 

Función principal: obtener la URL de la imagen del título:

 public static function getImageURL($title) { $images = self::getImageFilenameObj($title); // returns JSON object if (!$images) return ''; foreach ($images as $image) { // get object of image URL for given filename $imgjson = self::getFileURLObj($image->title); // return first image match foreach ($imgjson as $img) { // get URL for image $url = $img->imageinfo[0]->url; // no image found if (!$url) continue; // filter generic images if (self::isGeneric($url)) continue; // match found return $url; } } // match not found return ''; } 

== Las siguientes funciones son llamadas por la función principal anterior ==

Obtener el objeto JSON (nombres de archivo) por título:

 public static function getImageFilenameObj($title) { try // see if page has images { // get image file name $json = json_decode( self::retrieveInfo( self::$baseurl . '?action=query&titles=' . urlencode($title) . '&prop=images&format=json' ))->query->pages; /** The foreach is only to get around * the fact that we don't have the id. */ foreach ($json as $id) { return $id->images; } } catch(exception $e) // no images { return NULL; } } 

Obtiene el objeto JSON (URL) por nombre de archivo:

 public static function getFileURLObj($filename) { try // resolve URL from filename { return json_decode( self::retrieveInfo( self::$baseurl . '?action=query&titles=' . urlencode($filename) . '&prop=imageinfo&iiprop=url&format=json' ))->query->pages; } catch(exception $e) // no URLs { return NULL; } } 

Filtra imágenes genéricas:

 public static function isGeneric($url) { $generic_strings = array( '_gray.svg', 'icon', 'Commons-logo.svg', 'Ambox', 'Text_document_with_red_question_mark.svg', 'Question_book-new.svg', 'Canadese_kano', 'Wiki_letter_', 'Edit-clear.svg', 'WPanthroponymy', 'Compass_rose_pale', 'Us-actor.svg', 'voting_box', 'Crystal_', 'transportation_inv', 'arrow.svg', 'Quill_and_ink-US.svg', 'Decrease2.svg', 'Rating-', 'template', 'Nuvola_apps_', 'Mergefrom.svg', 'Portal-', 'Translation_to_', '/School.svg', 'arrow', 'Symbol_', 'stub', 'Unbalanced_scales.svg', '-logo.', 'P_vip.svg', 'Books-aj.svg_aj_ashton_01.svg', 'Film', '/Gnome-', 'cap.svg', 'Missing', 'silhouette', 'Star_empty.svg', 'Music_film_clapperboard.svg', 'IPA_Unicode', 'symbol', '_highlighting_', 'pictogram', 'Red_pog.svg', '_medal_with_cup', '_balloon', 'Feature', 'Aiga_' ); foreach ($generic_strings as $str) { if (stripos($url, $str) !== false) return true; } return false; } 

Comentarios bienvenidos.

Consulte el ejemplo de API de MediaWiki para obtener la imagen principal de una página de wikipedia: https://www.mediawiki.org/wiki/API:Page_info_in_search_results .

Como han mencionado otros, usaría prop=pageimages en su consulta API.

Si también desea la descripción de la imagen, usaría prop=pageimages|pageterms en su consulta API.

Puedes obtener la imagen original usando piprop=original . O puede obtener una imagen en miniatura con un ancho / alto especificado. Para una miniatura con ancho / alto = 600, piprop=thumbnail&pithumbsize=600 . Si omite cualquiera de los dos, la imagen devuelta en la callback de la API tendrá una miniatura predeterminada con ancho / alto de 50 píxeles.

Si está solicitando resultados en formato JSON, siempre debe usar formatversion=2 en su consulta API (es decir, format=json&formatversion=2 ) porque facilita la recuperación de la imagen de la consulta.

Imagen de tamaño original:

 https://en.wikipedia.org/w/api.php?action=query&format=json&formatversion=2&prop=pageimages|pageterms&piprop=original&titles=Albert Einstein 

Tamaño de miniatura (600px ancho / alto) Imagen:

 https://en.wikipedia.org/w/api.php?action=query&format=json&formatversion=2&prop=pageimages|pageterms&piprop=thumbnail&pithumbsize=600&titles=Albert Einstein 

Existe una forma de obtener de manera confiable una imagen principal para una página de wikipedia: la extensión llamada PageImages

La extensión PageImages recostack información sobre las imágenes utilizadas en una página.

Su objective es devolver la miniatura más adecuada asociada con un artículo, intentando devolver solo imágenes significativas, p. Ej., No las de plantillas de mantenimiento, talones o icons de banderas. Actualmente utiliza la primera imagen sin sentido utilizada en la página.

https://www.mediawiki.org/wiki/Extension:PageImages

Simplemente agregue las imágenes de la página de utilería a su consulta API:

 /w/api.php?action=query&prop=pageimages&titles=Somepage&format=xml 

¡Esto filtra de manera confiable las molestas imágenes predeterminadas y evita que tenga que filtrarlas usted mismo! La extensión está instalada en todas las páginas principales de wikipedia …

Vea esta pregunta relacionada en una API para Wikipedia . Sin embargo, no sabría si es posible recuperar la imagen en miniatura a través de una API.

También puede considerar analizar la página web para encontrar la URL de la imagen y recuperar la imagen de esa manera.

Permite tomar el Ejemplo de página http://en.wikipedia.org/wiki/index.html?curid=57570 para obtener la Imagen principal

Revisa

prop = pageprops

action = query & pageids = 57570 & prop = pageprops y format = json

Resultados Página Datos por ejemplo.

 { "pages" : { "57570":{ "pageid":57570, "ns":0, "title":"Sachin Tendulkar", "pageprops" : { "defaultsort":"Tendulkar,Sachin", "page_image":"Sachin_at_Castrol_Golden_Spanner_Awards_(crop).jpg", "wikibase_item":"Q9488" } } } }} 

Aquí está mi lista de XPaths que he encontrado que funciona para el 95 por ciento de los artículos. los principales son 1, 2 3 y 4. Muchos artículos no están formateados correctamente y estos serían casos extremos:

Puede utilizar una lib de análisis DOM para obtener imágenes usando XPath.

 static NSString *kWikipediaImageXPath2 = @"//*[@id=\"mw-content-text\"]/div[1]/div/table/tr[2]/td/a/img"; static NSString *kWikipediaImageXPath3 = @"//*[@id=\"mw-content-text\"]/div[1]/table/tr[1]/td/a/img"; static NSString *kWikipediaImageXPath1 = @"//*[@id=\"mw-content-text\"]/div[1]/table/tr[2]/td/a/img"; static NSString *kWikipediaImageXPath4 = @"//*[@id=\"mw-content-text\"]/div[2]/table/tr[2]/td/a/img"; static NSString *kWikipediaImageXPath5 = @"//*[@id=\"mw-content-text\"]/div[1]/table/tr[2]/td/p/a/img"; static NSString *kWikipediaImageXPath6 = @"//*[@id=\"mw-content-text\"]/div[1]/table/tr[2]/td/div/div/a/img"; static NSString *kWikipediaImageXPath7 = @"//*[@id=\"mw-content-text\"]/div[1]/table/tr[1]/td/div/div/a/img"; 

Usé un contenedor ObjC llamado Hpple alrededor de libxml2.2 para extraer la url de la imagen. Espero que esto ayude

Creo que no, pero puedes capturar la imagen usando un analizador de enlaces documentos HTML

Como mencionó Anuraj, el parámetro pageimages lo es. Mira la siguiente url que traerá algunas cosas ingeniosas:

 https://en.wikipedia.org/w/api.php?action=query&prop=info|extracts|pageimages|images&inprop=url&exsentences=1&titles=india 

Ella son algunos parámetros interesantes:

  • Los dos extractos y exsentences de los parámetros le dan una breve descripción que puede usar. (Exsentences es el número de oraciones que desea incluir en el extracto)
  • La información y los parámetros inprop = url te dan la url de la página
  • La propiedad prop tiene múltiples parámetros separados por un símbolo de barra
  • Y si inserta el formato = json allí, es aún mejor