web-dev-qa-db-fra.com

Accès à l'image principale de la page wikipedia par API

Existe-t-il un moyen d'accéder à la vignette d'une page wikipedia en utilisant une API? Je veux dire l'image en haut à droite dans la boîte. Existe-t-il des API pour cela?

51
insomiac

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

Regarder prop=images.

Il renvoie un tableau de noms de fichiers image utilisés dans la page analysée. Vous avez ensuite la possibilité d'effectuer un autre appel d'API pour connaître l'URL complète de l'image, par exemple: action=query&titles=Image:INSERT_EXAMPLE_FILE_NAME_HERE.jpg&prop=imageinfo&iiprop=url

ou à calculer l'URL via le hachage du nom de fichier .

Malheureusement, alors que le tableau d'images renvoyé par prop=images est dans l'ordre où elles se trouvent sur la page, la première ne peut pas être garantie comme étant l'image dans la boîte d'informations car parfois une page inclura une image avant l'infobox (la plupart du temps des icônes pour les métadonnées sur la page: par exemple "cet article est verrouillé").

La recherche dans le tableau d'images de la première image qui inclut le titre de la page est probablement la meilleure estimation pour l'image de l'infobox.

50
varatis

Vous pouvez obtenir la vignette de n'importe quelle page wikipedia en utilisant prop=pageimages. Par exemple:

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

Et vous obtiendrez l'URL complète de la miniature.

59
Assaf Shemesh

C'est un bon moyen d'obtenir l'image principale d'une page dans wikipedia

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

17
Anuraj

Consultez l'exemple d'API MediaWiki pour obtenir l'image principale d'une page wikipedia: https://www.mediawiki.org/wiki/API:Page_info_in_search_results .

Comme d'autres l'ont mentionné, vous utiliseriez prop=pageimages dans votre requête API.

Si vous souhaitez également la description de l'image, vous utiliserez prop=pageimages|pageterms à la place dans votre requête API.

Vous pouvez obtenir l'image d'origine en utilisant piprop=original. Ou vous pouvez obtenir une image miniature avec une largeur/hauteur spécifiée. Pour une miniature avec largeur/hauteur = 600, piprop=thumbnail&pithumbsize=600. Si vous omettez l'un ou l'autre, l'image renvoyée dans le rappel de l'API sera par défaut une miniature avec une largeur/hauteur de 50 px.

Si vous demandez des résultats au format JSON, vous devez toujours utiliser formatversion=2 dans votre requête API (par exemple, format=json&formatversion=2) car il facilite la récupération de l'image à partir de la requête.

Image de taille originale:

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

Taille de la vignette (600px largeur/hauteur) Image:

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

Méthode 1: vous pouvez essayer une requête comme celle-ci:

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

dans la réponse, vous pouvez voir la balise Image.

<Item>
<Text xml:space="preserve">Italy national rugby union team</Text>
<Description xml:space="preserve">
The Italy national rugby union team represent the nation of Italy in the sport of rugby union.
</Description>
<Url xml:space="preserve">
http://en.wikipedia.org/wiki/Italy_national_rugby_union_team
</Url>
<Image source="http://upload.wikimedia.org/wikipedia/en/thumb/4/46/Italy_rugby.png/43px-Italy_rugby.png" width="43" height="50"/>
</Item>

Méthode 2: utilisez la requête http://en.wikipedia.org/w/index.php?action=render&title=italy

alors vous pouvez obtenir un code html brut, vous pouvez obtenir l'image utiliser quelque chose comme PHP Simple HTML DOM Parserhttp://simplehtmldom.sourceforge.net

Je n'ai pas le temps de vous l'écrire. juste vous donner quelques conseils, merci.

6
Giberno

Je suis désolé de ne pas avoir répondu spécifiquement à votre question sur l'image principale . Mais voici du code pour obtenir une liste de toutes les images:

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'));

J'ai obtenu ceci pour http://en.wikipedia.org/wiki/Saturn_%28mythology%29 :

Array
(
    [0] => http://upload.wikimedia.org/wikipedia/commons/1/10/Arch_of_SeptimiusSeverus.jpg
    [1] => http://upload.wikimedia.org/wikipedia/commons/8/81/Ivan_Akimov_Saturn_.jpg
    [2] => http://upload.wikimedia.org/wikipedia/commons/d/d7/Lucius_Appuleius_Saturninus.jpg
    [3] => http://upload.wikimedia.org/wikipedia/commons/2/2c/Polidoro_da_Caravaggio_-_Saturnus-thumb.jpg
    [4] => http://upload.wikimedia.org/wikipedia/commons/b/bd/Porta_Maggiore_Alatri.jpg
    [5] => http://upload.wikimedia.org/wikipedia/commons/6/6a/She-wolf_suckles_Romulus_and_Remus.jpg
    [6] => http://upload.wikimedia.org/wikipedia/commons/4/45/Throne_of_Saturn_Louvre_Ma1662.jpg
)

Et pour la deuxième URL ( http://en.wikipedia.org/wiki/Hans-Ulrich_Rudel ):

Array
(
    [0] => http://upload.wikimedia.org/wikipedia/commons/e/e9/BmRKEL.jpg
    [1] => http://upload.wikimedia.org/wikipedia/commons/3/3f/BmRKELS.jpg
    [2] => http://upload.wikimedia.org/wikipedia/commons/2/2c/Bundesarchiv_Bild_101I-655-5976-04%2C_Russland%2C_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://upload.wikimedia.org/wikipedia/en/6/64/HansUlrichRudel.jpeg
    [6] => http://upload.wikimedia.org/wikipedia/commons/8/82/Heinkel_He_111_during_the_Battle_of_Britain.jpg
    [7] => http://upload.wikimedia.org/wikipedia/commons/6/66/Regulation_WW_II_Underwing_Balkenkreuz.png
)

Notez que l'URL a changé un peu sur le 6ème élément du deuxième tableau. C'est ce que @JosephJaber mettait en garde dans son commentaire ci-dessus.

J'espère que cela aide quelqu'un.

5
Óscar Palacios

J'ai écrit du code qui obtient l'image principale (URL complète) par le titre de l'article Wikipedia. Ce n'est pas parfait, mais dans l'ensemble, je suis très satisfait des résultats.

Le défi était que lorsque demandé pour un titre spécifique, Wikipédia renvoie plusieurs noms de fichiers d'image (sans chemin). De plus, la recherche secondaire (j'ai utilisé le code varatis publié dans ce fil - merci!) Renvoie les URL de toutes les images trouvées en fonction du nom de fichier de l'image recherchée, quel que soit le titre de l'article d'origine. Après tout cela, nous pouvons nous retrouver avec une image générique sans rapport avec la recherche, nous les filtrons donc. Le code itère sur les noms de fichiers et les URL jusqu'à ce qu'il trouve (espérons-le le meilleur) la correspondance ... un peu compliqué, mais cela fonctionne :)

Remarque sur le filtre générique: j'ai compilé une liste de chaînes d'images génériques pour la fonction isGeneric (), mais la liste continue de croître. J'envisage de le maintenir en tant que liste publique - s'il y a un intérêt, faites-le moi savoir.

Pré:

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

Fonction principale - obtenir l'URL de l'image à partir du titre:

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 '';          
}

== Les fonctions suivantes sont appelées par la fonction principale ci-dessus ==

Obtenez l'objet JSON (noms de fichiers) par titre:

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;
    }
}   

Obtenez l'objet JSON (URL) par nom de fichier:

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;
    }
}   

Filtrer les images génériques:

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;
}

Commentaires bienvenus.

5
vanwinter

Il existe un moyen d'obtenir de manière fiable une image principale pour une page wikipedia - l'extension appelée PageImages

L'extension PageImages collecte des informations sur les images utilisées sur une page.

Son objectif est de renvoyer la vignette la plus appropriée associée à un article, en essayant de renvoyer uniquement des images significatives, par exemple pas ceux des modèles de maintenance, des talons ou des icônes de drapeau. Actuellement, il utilise la première image non dénuée de sens utilisée dans la page.

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

Ajoutez simplement les images de page prop à votre requête API:

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

Cela filtre de manière fiable les images par défaut ennuyeuses et vous évite d'avoir à les filtrer vous-même! L'extension est installée sur toutes les pages principales de wikipedia ...

3
Paul Weber

Prenons l'exemple de la page http://en.wikipedia.org/wiki/index.html?curid=5757 pour obtenir l'image principale

Check-out

prop = pageprops

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

Données de la page de résultats.

{ "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"
                    }
            }
          }
 }}

Nous obtenons le nom du fichier principal Pic ce résultat comme

** (wikiId) .pageprops.page_image = Sachin_at_Castrol_Golden_Spanner_Awards_ (crop) .jpg **

Maintenant que nous avons le nom du fichier image, nous devrons effectuer un autre appel Api pour obtenir le chemin complet de l'image à partir du nom de fichier comme suit

action = requête & titres = Image: INSERT_EXAMPLE_FILE_NAME_HERE.jpg & prop = imageinfo & iiprop = url

Par exemple.

action = requête & titres = Image: Sachin_at_Castrol_Golden_Spanner_Awards_ (crop) .jpg & prop = imageinfo & iiprop = url

Renvoie un tableau de données d'image contenant une URL en tant que http://upload.wikimedia.org/wikipedia/commons/3/35/Sachin_at_Castrol_Golden_Spanner_Awards_%28crop%29.jpg =

1
Vineed

Voir cette question connexe sur une API pour Wikipedia . Cependant, je ne sais pas s'il est possible de récupérer l'image miniature via une API.

Vous pouvez également envisager d'analyser la page Web pour trouver l'URL de l'image et récupérer l'image de cette façon.

1
The Nail

Comme Anuraj l'a mentionné, le paramètre pageimages est celui-ci. Regardez l'url suivante qui apportera des trucs astucieux:

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

Voici quelques paramètres intéressants:

  • Les deux paramètres extraits et exsentences vous donnent une brève description que vous pouvez utiliser. (exsentences est le nombre de phrases que vous souhaitez inclure dans l'extrait)
  • Les informations et les paramètres inprop = url vous donnent l'url de la page
  • La propriété prop a plusieurs paramètres séparés par un symbole de barre
  • Et si vous insérez le format = json là-dedans, c'est encore mieux
1
netfed

Voici ma liste de XPaths pour lesquels j'ai trouvé du travail pour 95% des articles. les principaux sont 1, 2 3 et 4. Beaucoup d'articles ne sont pas formatés correctement et ce seraient des cas Edge:

Vous pouvez utiliser une bibliothèque d'analyse DOM pour récupérer une image à l'aide de 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";

J'ai utilisé un wrapper ObjC appelé Hpple autour de libxml2.2 pour extraire l'url de l'image. J'espère que cela t'aides

0
Vlad