ti-enxame.com

Acessando a imagem principal da página da Wikipedia pela API

Existe alguma maneira de acessar a imagem em miniatura de qualquer página da Wikipedia usando uma API? Quero dizer a imagem no lado superior direito da caixa. Existe alguma API para isso?

51
insomiac

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

Olhe para a prop=images.

Retorna uma matriz de nomes de arquivos de imagem usados ​​na página analisada. Você tem a opção de fazer outra chamada à API para descobrir o URL da imagem completa, por exemplo: action=query&titles=Image:INSERT_EXAMPLE_FILE_NAME_HERE.jpg&prop=imageinfo&iiprop=url

ou calcule o URL através do hash do nome do arquivo .

Infelizmente, enquanto o conjunto de imagens retornado por prop=images está na ordem em que são encontrados na página, não é possível garantir que a primeira seja a imagem na caixa de informações, porque às vezes uma página inclui uma imagem antes da caixa de informações (na maioria das vezes ícones de metadados sobre a página: por exemplo "este artigo está bloqueado").

Pesquisar a primeira imagem que inclui o título da página na matriz de imagens é provavelmente o melhor palpite para a imagem da caixa de informações.

50
varatis

Você pode obter a miniatura de qualquer página da Wikipedia usando prop=pageimages. Por exemplo:

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

E você obterá o URL completo da miniatura.

59
Assaf Shemesh

Esta é uma boa maneira de obter a imagem principal de uma página na wikipedia

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

17
Anuraj

Confira o exemplo da API do MediaWiki para obter a imagem principal de uma página da Wikipedia: https://www.mediawiki.org/wiki/API:Page_info_in_search_results .

Como outros já mencionaram, você usaria prop=pageimages na sua consulta à API.

Se você também quiser a descrição da imagem, use prop=pageimages|pageterms em vez disso, na sua consulta à API.

Você pode obter a imagem original usando piprop=original. Ou você pode obter uma imagem em miniatura com uma largura/altura especificada. Para uma miniatura com largura/altura = 600, piprop=thumbnail&pithumbsize=600. Se você omitir, a imagem retornada no retorno de chamada da API será padronizada como uma miniatura com largura/altura de 50px.

Se você estiver solicitando resultados no formato JSON, sempre use formatversion=2 na sua consulta à API (ou seja, format=json&formatversion=2) porque facilita a recuperação da imagem da consulta.

Imagem em tamanho original:

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

Tamanho da miniatura (largura/altura de 600 px) Imagem:

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

Caminho 1: você pode tentar uma consulta como esta:

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

na resposta, você pode ver a tag 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>

Caminho 2: use query http://en.wikipedia.org/w/index.php?action=render&title=italy

então você pode obter um código html bruto, a imagem pode usar algo como PHP Simple HTML DOM Parserhttp://simplehtmldom.sourceforge.net

Não tenho tempo para escrever para você. apenas dê alguns conselhos, obrigado.

6
Giberno

Sinto muito por não responder especificamente à sua pergunta sobre a imagem principal . Mas aqui está um código para obter uma lista de todas as imagens:

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

Eu obtive isso para 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
)

E para o segundo 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
)

Observe que o URL mudou um pouco no sexto elemento da segunda matriz. É sobre isso que JosephJaber estava alertando em seu comentário acima.

Espero que isso ajude alguém.

5
Óscar Palacios

Eu escrevi algum código que obtém a imagem principal (URL completo) pelo título do artigo da Wikipedia. Não é perfeito, mas no geral estou muito satisfeito com os resultados.

O desafio foi que, quando consultado para um título específico, a Wikipedia retorna vários nomes de arquivos de imagem (sem caminho). Além disso, a pesquisa secundária (usei o código varatis publicado neste tópico - obrigado!) Retorna URLs de todas as imagens encontradas com base no nome do arquivo de imagem pesquisado, independentemente do título do artigo original. Depois de tudo isso, podemos acabar com uma imagem genérica irrelevante para a pesquisa, para filtrá-las. O código repete nomes de arquivos e URLs até encontrar (espero que o melhor) corresponder ... um pouco complicado, mas funciona :)

Nota sobre o filtro genérico: estou compilando uma lista de seqüências de imagens genéricas para a função isGeneric (), mas a lista continua crescendo. Estou pensando em mantê-lo como uma lista pública - se houver algum interesse, me avise.

Pré:

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

Função principal - obtenha o URL da imagem do 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 '';          
}

== As seguintes funções são chamadas pela função principal acima ==

Obter objeto JSON (nomes de arquivos) 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;
    }
}   

Obter objeto JSON (URLs) por nome de arquivo:

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

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

Comentários bem-vindos.

5
vanwinter

Existe uma maneira de obter uma imagem principal de forma confiável para uma página da Wikipedia - a Extensão chamada PageImages

A extensão PageImages coleta informações sobre as imagens usadas em uma página.

Seu objetivo é retornar a miniatura mais apropriada associada a um artigo, tentando retornar apenas imagens significativas, por exemplo, não os de modelos de manutenção, stubs ou ícones de sinalização. Atualmente, ele usa a primeira imagem sem sentido usada na página.

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

Basta adicionar as imagens da página de propulsão à sua consulta da API:

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

Isso filtra de forma confiável as imagens padrão irritantes e evita que você precise filtrá-las por conta própria! A extensão está instalada em todas as principais páginas da Wikipedia ...

3
Paul Weber

Vamos dar o exemplo da página http://en.wikipedia.org/wiki/index.html?curid=5757 para obter a foto principal

Confira

prop = pageprops

ação = consulta & pageids = 57570 & prop = pageprops & format = json

Dados da página de resultados.

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

Ficamos com o nome principal do arquivo Pic desse resultado como

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

Agora, como temos o nome do arquivo de imagem, teremos que fazer outra chamada da API para obter o caminho completo da imagem a partir do nome do arquivo, da seguinte maneira

ação = consulta e títulos = Imagem: INSERT_EXAMPLE_FILE_NAME_HERE.jpg & prop = imageinfo & iiprop = url

Por exemplo.

action = consulta e títulos = Image: Sachin_at_Castrol_Golden_Spanner_Awards_ (crop) .jpg & prop = imageinfo & iiprop = url

Retorna uma matriz de dados de imagem com URL como http://upload.wikimedia.org/wikipedia/commons/3/35/Sachin_at_Castrol_Gastren_Spanner_Awards_%28crop%29.jpg =

1
Vineed

Veja esta questão relacionada em uma API para Wikipedia . No entanto, eu não saberia se é possível recuperar a imagem em miniatura por meio de uma API.

Você também pode considerar apenas analisar a página da Web para encontrar o URL da imagem e recuperar a imagem dessa maneira.

1
The Nail

Como Anuraj mencionou, o parâmetro pageimages é esse. Veja o seguinte URL que trará algumas coisas bacanas:

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

Aqui estão alguns parâmetros interessantes:

  • Os dois parâmetros extratos e exsentences fornecem uma breve descrição que você pode usar. (exsentências é o número de frases que você deseja incluir no trecho)
  • As informações e os parâmetros inprop = url fornecem o URL da página
  • A propriedade prop possui vários parâmetros separados por um símbolo de barra
  • E se você inserir o format = json lá, é ainda melhor
1
netfed

Acho que não, mas você pode capturar a imagem usando documentos HTML de um analisador de links

0
user862010

Aqui está minha lista de XPaths que encontrei para 95% dos artigos. os principais são 1, 2 3 e 4. Muitos artigos não estão formatados corretamente e esses seriam os casos do Edge:

Você pode usar uma lib de análise do DOM para buscar a imagem usando o 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";

Eu usei um wrapper ObjC chamado Hpple em torno da libxml2.2 para obter o URL da imagem. Espero que isto ajude

0
Vlad