Есть ли способ получить доступ к миниатюрному изображению любой страницы wikipedia с помощью API? Я имею в виду изображение в верхней правой части окна. Есть ли для этого API?
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
находится в том порядке, в котором они найдены на странице, первое не может быть гарантировано изображением в информационном окне, потому что иногда страница будет содержать изображение перед инфобоксами (большинство значков времени для метаданных о странице: например, «эта статья заблокирована»).
Поиск массива изображений для первого изображения, включающего название страницы, вероятно, является лучшим предположением для изображения инфобокса.
Вы можете получить миниатюру любой страницы wikipedia, используя prop=pageimages
. Например:
http://en.wikipedia.org/w/api.php?action=query&titles=Al-Farabi&prop=pageimages&format=json&pithumbsize=100
И вы получите полный URL-адрес эскиза.
Это хороший способ получить основное изображение страницы в википедии
Способ 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://img.ruphp.com/php/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
У меня нет времени написать это вам. просто дайте вам несколько советов, спасибо.
Мне жаль, что я не ответил на ваш вопрос об основном изображении. Но вот некоторый код, чтобы получить список всех изображений:
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://img.ruphp.com/php/Arch_of_SeptimiusSeverus.jpg [1] => http://img.ruphp.com/php/Ivan_Akimov_Saturn_.jpg [2] => http://img.ruphp.com/php/Lucius_Appuleius_Saturninus.jpg [3] => http://img.ruphp.com/php/Polidoro_da_Caravaggio_-_Saturnus-thumb.jpg [4] => http://img.ruphp.com/php/Porta_Maggiore_Alatri.jpg [5] => http://img.ruphp.com/php/She-wolf_suckles_Romulus_and_Remus.jpg [6] => http://img.ruphp.com/php/Throne_of_Saturn_Louvre_Ma1662.jpg )
И для второго URL ( http://en.wikipedia.org/wiki/Hans-Ulrich_Rudel ):
Array ( [0] => http://img.ruphp.com/php/BmRKEL.jpg [1] => http://img.ruphp.com/php/BmRKELS.jpg [2] => http://img.ruphp.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.ruphp.com/php/HansUlrichRudel.jpeg [6] => http://img.ruphp.com/php/Heinkel_He_111_during_the_Battle_of_Britain.jpg [7] => http://img.ruphp.com/php/Regulation_WW_II_Underwing_Balkenkreuz.png )
Обратите внимание, что URL-адрес немного изменился на 6-й элемент второго массива. Это то, о чем @JosephJaber предупреждал в своем комментарии выше.
Надеюсь, это поможет кому-то.
Я написал код, который получает основной образ (полный URL) по названию статьи в Википедии. Это не идеально, но в целом я очень доволен результатами.
Проблема заключалась в том, что при запросе на определенный заголовок Wikipedia возвращает несколько имен файлов изображений (без пути). Кроме того, вторичный поиск (я использовал код 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; }
Комментарии приветствуются.
У меня есть способ надежно получить основной образ для страницы википедии – Расширение, называемое PageImages
Расширение PageImages собирает информацию об изображениях, используемых на странице.
Его цель – вернуть единственную наиболее подходящую миниатюру, связанную со статьей, пытаясь вернуть только содержательные изображения, например, не те из шаблонов обслуживания, заглушек или значков флагов. В настоящее время он использует первый бессмысленный образ, используемый на странице.
https://www.mediawiki.org/wiki/Extension:PageImages
Просто добавьте URL-адрес профайла в ваш запрос API:
/w/api.php?action=query&prop=pageimages&titles=Somepage&format=xml
Это надежно отфильтровывает раздражающие изображения по умолчанию и не позволяет вам фильтровать их самостоятельно! Расширение установлено на всех основных страницах википедии …
Ознакомьтесь с примером API MediaWiki для получения основного изображения страницы wikipedia: 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
См. Этот связанный вопрос в API для Википедии . Однако я не знаю, можно ли получить изображение миниатюр через API.
Вы также можете рассмотреть только синтаксический анализ веб-страницы, чтобы найти URL-адрес изображения и получить изображение таким образом.
Давайте возьмем Пример страницы http://en.wikipedia.org/wiki/index.html?curid=57570, чтобы получить главную картинку
Проверять, выписываться
проп = 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" } } } }}
Вот мой список XPaths, который я нашел для 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-адрес изображения. Надеюсь это поможет
Я думаю, что нет, но вы можете захватить изображение, используя HTML-документы с парсером ссылок
Как сказал Анурайдж, параметр pageimages – это. Посмотрите на следующий URL-адрес, который принесет некоторые изящные вещи:
https://en.wikipedia.org/w/api.php?action=query&prop=info|extracts|pageimages|images&inprop=url&exsentences=1&titles=india
Ее некоторые интересные параметры: