Acessando a imagem principal da página wikipedia por API

Existe alguma maneira de acessar a imagem em miniatura de qualquer página da wikipedia usando uma API? Quero dizer, a imagem no canto superior direito na checkbox. Existe alguma API para isso?

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

Olhe para prop=images .

Ele retorna uma série de nomes de arquivos de imagem que são usados ​​na página analisada. Você então tem a opção de fazer outra chamada de API para descobrir o URL completo da imagem, por exemplo: action=query&titles=Image:INSERT_EXAMPLE_FILE_NAME_HERE.jpg&prop=imageinfo&iiprop=url

ou para calcular o URL através do hash do nome do arquivo .

Infelizmente, enquanto a matriz de imagens retornadas por prop=images está na ordem em que são encontradas na página, o primeiro não pode ser garantido para ser a imagem na checkbox de informações, porque às vezes uma página includeá uma imagem antes da infobox (a maioria dos icons de tempo para metadados sobre a página: por exemplo, “este artigo está bloqueado”).

Procurar a matriz de imagens para a primeira imagem que inclui o título da página é provavelmente o melhor palpite para a imagem da infobox.

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ê receberá o URL completo da miniatura.

Esta é uma boa maneira de obter a Imagem Principal de uma página em wikipedia

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

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=0

na resposta, você pode ver a etiqueta da imagem.

  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    

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

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

Eu não tenho tempo escrevê-lo para você. Apenas dê alguns conselhos, obrigado.

Lamento 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 entendi isso para http://en.wikipedia.org/wiki/Saturn_%28mythology%29 :

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

E para o segundo URL ( http://en.wikipedia.org/wiki/Hans-Ulrich_Rudel ):

 Array ( [0] => http://img.bestphpide.com/php/BmRKEL.jpg [1] => http://img.bestphpide.com/php/BmRKELS.jpg [2] => http://img.bestphpide.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.bestphpide.com/php/HansUlrichRudel.jpeg [6] => http://img.bestphpide.com/php/Heinkel_He_111_during_the_Battle_of_Britain.jpg [7] => http://img.bestphpide.com/php/Regulation_WW_II_Underwing_Balkenkreuz.png ) 

Observe que o URL mudou um pouco no 6º elemento da segunda matriz. É o que o @JosephJaber estava avisando em seu comentário acima.

Espero que isso ajude alguém.

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

O desafio foi que quando questionado para um título específico, a Wikipedia retorna vários nomes de imagens (sem caminho). Além disso, a pesquisa secundária (eu 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 que foi pesquisado, independentemente do título do artigo original. Depois de tudo isso, podemos acabar com uma imagem genérica irrelevante para a pesquisa, então nós filtramos isso. O código itera sobre nomes de arquivos e URLs até encontrar (espero que o melhor) corresponda … um pouco complicado, mas funciona 🙂

Nota sobre o filtro genérico: eu tenho compilado uma lista de cadeias genéricas de imagem para a function isGeneric (), mas a lista continua a crescer. Estou considerando mantê-lo como uma lista pública – se houver algum interesse, avise-me.

Pré:

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

Função principal – obter 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 function principal acima ==

Obter o object 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 o object 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.

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

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

Se você também quiser a descrição da imagem, você usaria 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á padrão para uma miniatura com largura / altura de 50px.

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

Tamanho do 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 (600px largura / altura) Imagem:

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

Existe uma maneira de obter de forma confiável uma imagem principal para uma página da wikipedia – a extensão chamada PageImages

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

Seu objective é retornar a miniatura mais apropriada associada a um artigo, tentando retornar apenas imagens significativas, por exemplo, não as de modelos de manutenção, stubs ou icons de bandeira. 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 prop à consulta da sua API:

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

Isso filtra de forma confiável imagens incômodas padrão e impede que você tenha que filtrar você mesmo! A extensão está instalada em todas as páginas principais do wikipedia …

Veja esta questão relacionada em uma API para a Wikipedia . No entanto, eu não saberia se é possível recuperar a imagem em miniatura através 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 desse jeito.

Vamos pegar um exemplo de página http://en.wikipedia.org/wiki/index.html?curid=57570 para obter o Main Pic

Confira

prop = pageprops

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

Dados da página de resultados, por exemplo.

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

Aqui está a minha lista de XPaths que encontrei trabalho por 95% dos artigos. os principais são 1, 2 3 e 4. Muitos artigos não são formatados corretamente e estes seriam casos de borda:

Você pode usar uma biblioteca de análise de DOM para buscar 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 de libxml2.2 para retirar o URL da imagem. Espero que isto ajude

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

Como Anuraj mencionado, o parâmetro pageimages é esse. Olhe para o seguinte URL que irá trazer algumas coisas astutas:

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

Ela é alguns parâmetros interessantes:

  • Os dois parâmetros extraídos e exsentences oferecem uma breve descrição que você pode usar. (exsentences é o número de frases que deseja include no trecho)
  • A informação 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 formato = json lá, é ainda melhor