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?
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.
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.
C'est un bon moyen d'obtenir l'image principale d'une page dans wikipedia
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
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 Parser
http://simplehtmldom.sourceforge.net
Je n'ai pas le temps de vous l'écrire. juste vous donner quelques conseils, merci.
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.
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.
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 ...
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 =
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.
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:
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