Подтвердить что ты не робот

Доступ к основному изображению страницы wikipedia по API

Есть ли способ получить доступ к миниатюрному изображению любой страницы wikipedia с помощью API? Я имею в виду изображение в верхней правой части окна. Существуют ли для этого API-интерфейсы?

4b9b3361

Ответ 1

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, находится в том порядке, в котором они находятся на странице, первое не может быть гарантировано изображением в информационном окне, потому что иногда страница будет включать изображение перед infobox (большинство значков времени для метаданных о странице: например, "эта статья заблокирована" ).

Поиск массива изображений для первого изображения, включающего название страницы, вероятно, является лучшим предположением для изображения инфобокса.

Ответ 2

Вы можете получить миниатюру любой страницы wikipedia, используя prop=pageimages. Например:

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

И вы получите полный URL эскиза.

Ответ 4

Способ 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

У меня нет времени написать это вам. просто дайте вам несколько советов, спасибо.

Ответ 5

Прошу прощения за то, что я не ответил на ваш вопрос об основном изображении. Но вот какой-то код, чтобы получить список всех изображений:

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 предупреждал в своем комментарии выше.

Надеюсь, это поможет кому-то.

Ответ 6

Я написал код, который получает основное изображение (полный 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;
}

Комментарии приветствуются.

Ответ 7

У меня есть способ надежно получить основное изображение для страницы википедии - расширение, называемое PageImages

Расширение PageImages собирает информацию об изображениях, используемых на странице.

Его цель - вернуть единственную наиболее подходящую миниатюру со статьей, пытаясь вернуть только осмысленные изображения, например. не те из шаблонов обслуживания, заглушек или значков флагов. В настоящее время использует первое бессмысленное изображение, используемое на странице.

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

Просто добавьте URL-адрес профайла в ваш запрос API:

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

Это надежно отфильтровывает раздражающие изображения по умолчанию и не позволяет вам фильтровать их самостоятельно! Расширение установлено на всех основных страницах википедии...

Ответ 8

Ознакомьтесь с примером 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

Ответ 9

См. этот связанный вопрос по API для Википедии. Тем не менее, я не знаю, можно ли получить изображение миниатюр через API.

Вы также можете рассмотреть только синтаксический анализ веб-страницы, чтобы найти URL-адрес изображения и получить изображение таким образом.

Ответ 10

Давайте возьмем Пример страницы 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"
                    }
            }
          }
 }}

Ответ 11

Вот мой список 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-адрес изображения. Надеюсь, что это поможет

Ответ 12

Я думаю, что нет, но вы можете захватить изображение, используя HTML-документы парсера ссылок

Ответ 13

Как упоминал Анурайдж, параметр pageimages - это. Посмотрите на следующий URL-адрес, который принесет некоторые полезные вещи:

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

Есть несколько интересных параметров:

  • Два экстракта и экстенты параметров дают вам короткий описание вы можете использовать. (exsentences - количество предложений, которые вы хотите включить в выдержку)
  • Параметры info и inprop = url дают URL-адрес страницы
  • Свойство prop имеет несколько параметров, разделенных символом штриха
  • И если вы вставляете туда формат = json, это даже лучше