通过API访问维基百科页面的主要图片

ins*_*iac 52 php api wikipedia-api

有什么办法可以使用API​​访问任何维基百科页面的缩略图吗?我的意思是盒子右上方的图像.那有什么API吗?

Ass*_*esh 59

您可以使用任何维基百科页面的缩略图prop=pageimages.例如:

http://en.wikipedia.org/w/api.php?action=query&titles=Al-Farabi&prop=pageimages&format=json&pithumbsize=100
Run Code Online (Sandbox Code Playgroud)

您将获得缩略图完整的URL.

  • 这是一个很好的解决方案,但(对于记录)它基于一个标记为"实验性"的新API扩展.https://www.mediawiki.org/wiki/Extension:PageImages (2认同)

var*_*tis 51

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按照它们在页面上找到的顺序排列,但第一个不能保证是信息框中的图像,因为有时页面将在信息框之前包含图像(大多数时候)关于页面的元数据的图标:例如"这篇文章被锁定").

搜索包含页面标题的第一个图像的图像阵列可能是信息框图像的最佳猜测.

  • 最好使用API​​调用而不是计算自己的API调用,因为你仍然不知道它是否在Commons中,例如`/ commons/a/ae/Filename.jpg`或特定于语言的`/ en/a/ae/Filename. jpg` (7认同)
  • 现在有一个名为pageimages的新属性,可以过滤掉默认图像. (4认同)

Anu*_*raj 17

这是在维基百科中获取页面主图像的好方法

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

  • 这个答案很简短,但有效!`pageimages`可能是新属性,这就是之前没有涉及的原因,但它获取了页面的主要图像. (3认同)
  • 请注意,如果您还想获得非免费缩略图(即视频游戏、电影等),还需要添加 `&pilicense=any`。 (3认同)
  • 优雅!pageimages属性是它.结果可能是信息框模板中的第一张图片.如果您将图像添加到prop =,那么您还可以获得页面上的所有其他图像.(https://en.wikipedia.org/w/api.php?action=query&prop=info|extracts|pageimages|images&inprop=url&pageids=14533) (2认同)

kim*_*udi 7

查看MediaWiki API示例以获取维基百科页面的主要图片: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回调中返回的图像将默认为宽度/高度为50px的缩略图.

如果您以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
Run Code Online (Sandbox Code Playgroud)

缩略图尺寸(600px宽度/高度)图片:

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

  • 请注意,如果您还想获取非免费的缩略图(例如,用于视频游戏,电影等),还需要添加“&pilicense = any”。 (3认同)
  • 重要的是要注意,如果Wikipedia使用非免费图片,则“ pageimages”将不会返回图片网址。例如,尝试为Family Guy检索图像将不会返回图像:`https://en.wikipedia.org/w/api.php?action=query&format=json&formatversion=2&prop=pageimages|pageterms&piprop=original&titles=Family% 20Guy` (2认同)

Gib*_*rno 6

方式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>
Run Code Online (Sandbox Code Playgroud)

方式2:使用查询http://en.wikipedia.org/w/index.php?action=render&title=italy

那么你可以得到一个原始的HTML代码,你可以使用像http://simplehtmldom.sourceforge.net这样的图像.PHP Simple HTML DOM Parser

我没时间给你写信.请给你一些建议,谢谢.


Ósc*_*ios 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'));
Run Code Online (Sandbox Code Playgroud)

我得到了这个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
)
Run Code Online (Sandbox Code Playgroud)

对于第二个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
)
Run Code Online (Sandbox Code Playgroud)

请注意,URL在第二个数组的第6个元素上稍有改动.这是@JosephJaber在上面的评论中警告的内容.

希望这有助于某人.


van*_*ter 5

我写了一些代码,通过维基百科的文章标题获得主图像(完整的URL).这并不完美,但总的来说我对结果非常满意.

挑战在于,当查询特定标题时,维基百科会返回多个图像文件名(没有路径).此外,辅助搜索(我使用此线程中发布的代码varatis - 谢谢!)返回基于搜索的图像文件名找到的所有图像的URL,而不管原始文章标题.毕竟,我们最终可能会得到与搜索无关的通用图像,因此我们将这些图像过滤掉.代码迭代文件名和URL,直到找到(希望是最好的)匹配...有点复杂,但它的工作原理:)

关于泛型过滤器的注意事项:我一直在编译isGeneric()函数的通用图像字符串列表,但列表不断增长.我正在考虑将其保留为公开名单 - 如果有任何兴趣让我知道.

上一篇:

protected static $baseurl = "http://en.wikipedia.org/w/api.php";
Run Code Online (Sandbox Code Playgroud)

主要功能 - 从标题获取图像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 '';          
}
Run Code Online (Sandbox Code Playgroud)

==以上函数由上面的主函数==调用

按标题获取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;
    }
}   
Run Code Online (Sandbox Code Playgroud)

按文件名获取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;
    }
}   
Run Code Online (Sandbox Code Playgroud)

过滤掉通用图片:

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;
}
Run Code Online (Sandbox Code Playgroud)

欢迎评论.

  • +1列表的泛型! (2认同)