Доступ к основной картинке страницы википедии через API
Есть ли способ получить доступ к миниатюре любой страницы википедии с помощью API? Я имею в виду изображение на верхней правой стороне в коробке. Есть ли API для этого?
13 ответов
http://en.wikipedia.org/w/api.php
смотреть на prop=images
,
Возвращает массив имен файлов изображений, которые используются на проанализированной странице. Затем у вас есть возможность сделать еще один вызов API, чтобы узнать полный URL-адрес изображения, например:action=query&titles=Image:INSERT_EXAMPLE_FILE_NAME_HERE.jpg&prop=imageinfo&iiprop=url
или рассчитать URL через хеш имени файла.
К сожалению, пока массив изображений возвращается prop=images
в том порядке, в котором они находятся на странице, первое не может быть гарантировано изображением в информационном окне, потому что иногда страница будет содержать изображение перед информационным блоком (в большинстве случаев значки метаданных о странице: например, " эта статья заблокирована ").
Поиск массива изображений по первому изображению, которое включает заголовок страницы, вероятно, является наилучшим предположением для изображения инфобокса.
Вы можете получить эскиз любой страницы википедии, используя prop=pageimages
, Например:
http://en.wikipedia.org/w/api.php?action=query&titles=Al-Farabi&prop=pageimages&format=json&pithumbsize=100
И вы получите миниатюру полного URL.
Это хороший способ получить основное изображение страницы в википедии
Посмотрите пример API MediaWiki для получения основного изображения страницы википедии: https://www.mediawiki.org/wiki/API:Page_info_in_search_results.
Как уже упоминали другие, вы бы использовали prop=pageimages
в вашем запросе API.
Если вы также хотите описание изображения, вы бы использовали prop=pageimages|pageterms
вместо этого в вашем запросе API.
Вы можете получить оригинальное изображение, используя piprop=original
, Или вы можете получить уменьшенное изображение с указанной шириной / высотой. Для миниатюры с шириной / высотой =600, piprop=thumbnail&pithumbsize=600
, Если вы опустите любой из них, изображение, возвращаемое в обратном вызове API, по умолчанию станет миниатюрой с шириной / высотой 50 пикселей.
Если вы запрашиваете результаты в формате JSON, вы всегда должны использовать formatversion=2
в вашем запросе API (т.е. format=json&formatversion=2
), поскольку это облегчает получение изображения из запроса.
Исходный размер изображения:
https://en.wikipedia.org/w/api.php?action=query&format=json&formatversion=2&prop=pageimages|pageterms&piprop=original&titles=Albert Einstein
Размер миниатюры (ширина / высота 600 пикселей)
https://en.wikipedia.org/w/api.php?action=query&format=json&formatversion=2&prop=pageimages|pageterms&piprop=thumbnail&pithumbsize=600&titles=Albert Einstein
Прошу прощения, что не ответил конкретно на ваш вопрос об основном изображении. Но вот некоторый код, чтобы получить список всех изображений:
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'));
Я получил это для 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
)
И для второго 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
)
Обратите внимание, что URL-адрес немного изменился в 6-м элементе второго массива. Это то, о чем @JosephJaber предупреждал в своем комментарии выше.
Надеюсь, это кому-нибудь поможет.
Способ 1: Вы можете попробовать запрос, подобный этому:
http://en.wikipedia.org/w/api.php?action=opensearch&limit=5&format=xml&search=italy&namespace=0
в ответе вы можете увидеть 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>
Способ 2: используйте запрос http://en.wikipedia.org/w/index.php?action=render&title=italy
тогда вы можете получить необработанный HTML-код, вы можете получить изображение, используя что-то вроде PHP Simple HTML DOM Parser
http://simplehtmldom.sourceforge.net/
У меня нет времени, чтобы написать это вам. просто дать тебе совет, спасибо.
Я написал код, который получает основное изображение (полный URL) по заголовку статьи в Википедии. Это не идеально, но в целом я очень доволен результатами.
Проблема заключалась в том, что при запросе определенного заголовка Википедия возвращает несколько имен файлов изображений (без пути). Кроме того, дополнительный поиск (я использовал код varatis, опубликованный в этой теме - спасибо!) Возвращает URL-адреса всех найденных изображений на основе искомого имени файла изображения, независимо от исходного названия статьи. После всего этого мы можем получить общее изображение, не имеющее отношения к поиску, поэтому мы отфильтровываем его. Код перебирает имена файлов и URL до тех пор, пока не найдет (надеюсь, лучшее) совпадение... немного сложнее, но работает:)
Примечание к универсальному фильтру: я составлял список общих строк изображения для функции isGeneric(), но список только продолжает расти. Я подумываю о том, чтобы сохранить его в публичном списке - если есть интерес, дайте мне знать.
Pre:
protected static $baseurl = "http://en.wikipedia.org/w/api.php";
Основная функция - получить URL изображения из заголовка:
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 '';
}
== Следующие функции вызываются основной функцией выше ==
Получить объект JSON (имена файлов) по заголовку:
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;
}
}
Получить объект JSON (URL) по имени файла:
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;
}
}
Отфильтруйте общие изображения:
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;
}
Комментарии приветствуются.
Давайте возьмем пример страницы http://en.wikipedia.org/wiki/index.html?curid=57570 чтобы получить Main Pic
Проверять, выписываться
проп = pageprops
действие = запрос &pageids=57570& проп = pageprops & формат = JSON
Данные страницы результатов Например.
{ "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"
}
}
}
}}
Мы получаем основное имя файла Pic этот результат как
** (wikiId).pageprops.page_image = Sachin_at_Castrol_Golden_Spanner_Awards_(обрезать).jpg**
Теперь, когда у нас есть имя файла изображения, нам нужно будет сделать еще один вызов API, чтобы получить полный путь к изображению из имени файла следующим образом.
действие = запрос и название = Изображение:INSERT_EXAMPLE_FILE_NAME_HERE.jpg& проп =ImageInfo & iiprop = URL
Например.
действие = запрос и название = Изображение:Sachin_at_Castrol_Golden_Spanner_Awards_(растениеводство).jpg& проп =ImageInfo & iiprop = URL
Возвращает массив данных изображения с URL-адресом в виде http://upload.wikimedia.org/wikipedia/commons/3/35/Sachin_at_Castrol_Golden_Spanner_Awards_%28crop%29.jpg
Как упоминал Анурадж, параметр pageimages - это он. Посмотрите на следующий URL, который вызовет некоторые изящные вещи:
https://en.wikipedia.org/w/api.php?action=query&prop=info|extracts|pageimages|images&inprop=url&exsentences=1&titles=india
У нее есть несколько интересных параметров:
- Два параметра извлечения и расширения дают вам краткое описание, которое вы можете использовать. (exsentences - это количество предложений, которые вы хотите включить в отрывок)
- Информация и параметры inprop=url дают вам URL страницы
- Свойство prop имеет несколько параметров, разделенных символом бара
- И если вы вставите туда формат =json, это даже лучше
Существует способ надежно получить основное изображение для страницы википедии - расширение под названием PageImages
Расширение PageImages собирает информацию об изображениях, используемых на странице.
Его цель - вернуть единственный наиболее подходящий эскиз, связанный со статьей, пытаясь вернуть только значимые изображения, например, не из шаблонов обслуживания, заглушек или значков флагов. В настоящее время он использует первое бессмысленное изображение, используемое на странице.
https://www.mediawiki.org/wiki/Extension%3APageImages
Просто добавьте реквизиты страницы в ваш API-запрос:
/w/api.php?action=query&prop=pageimages&titles=Somepage&format=xml
Это надежно отфильтровывает раздражающие изображения по умолчанию и избавляет вас от необходимости фильтровать их самостоятельно! Расширение установлено на всех основных страницах Википедии...
Вы также можете использовать какао- стручки под названием SDWebImage
Пример кода (не забудьте также добавить import SDWebImage
):
func requestInfo(flowerName: String) {
let parameters : [String:String] = [
"format" : "json",
"action" : "query",
"prop" : "extracts|pageimages",//pageimages allows fetch imagePath
"exintro" : "",
"explaintext" : "",
"titles" : flowerName,
"indexpageids" : "",
"redirects" : "1",
"pithumbsize" : "500"//specify image size in px
]
AF.request(wikipediaURL, method: .get, parameters: parameters).responseJSON { (response) in
switch response.result {
case .success(let value):
print("Got the wikipedia info.")
print(response)
let flowerJSON : JSON = JSON(response.value!)
let pageid = flowerJSON["query"]["pageids"][0].stringValue
let flowerDescription = flowerJSON["query"]["pages"][pageid]["extract"].stringValue
let flowerImageURL = flowerJSON["query"]["pages"][pageid]["thumbnail"]["source"].stringValue //fetching Image URL
self.wikiInfoLabel.text = flowerDescription
self.imageView.sd_setImage(with: URL(string : flowerImageURL))//imageView updated with Wiki Image
case .failure(let error):
print(error)
}
}
}
Вот мой список XPath, которые я нашел для 95 процентов статей. основные из них - 1, 2, 3 и 4. Многие статьи отформатированы неправильно, и это будут крайние случаи:
Вы можете использовать библиотеку DOM для анализа изображений, используя 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";
Я использовал оболочку ObjC под названием Hpple вокруг libxml2.2, чтобы извлечь URL-адрес изображения. Надеюсь это поможет
Смотрите этот связанный вопрос по API для Википедии. Тем не менее, я не знаю, можно ли получить миниатюру изображения через API.
Вы также можете просто проанализировать веб-страницу, чтобы найти URL-адрес изображения и получить изображение таким образом.
Я думаю, что нет, но вы можете захватить изображение с помощью анализатора ссылок HTML-документов