web-dev-qa-db-ja.com

APIによるウィキペディアページのメイン画像へのアクセス

APIを使用してウィキペディアページのサムネイル画像にアクセスする方法はありますか?ボックスの右上にある画像を意味します。そのためのAPIはありますか?

51
insomiac

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によって返される画像の配列はページ上で見つかった順序ですが、最初のページは情報ボックス内の画像であることが保証されません。 (ほとんどの場合、ページに関するメタデータのアイコン:「この記事はロックされています」など)。

ページタイトルを含む最初の画像を画像の配列で検索するのが、おそらくインフォボックス画像の最良の推測です。

50
varatis

prop=pageimagesを使用して、ウィキペディアページのサムネイルを取得できます。例えば:

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

そして、サムネイルの完全なURLを取得します。

59
Assaf Shemesh

これは、ウィキペディアのページのメイン画像を取得する良い方法です

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

17
Anuraj

ウィキペディアページのメイン画像を取得するMediaWiki APIの例を確認してください: https://www.mediawiki.org/wiki/API:Page_info_in_search_results

他の人が述べたように、APIクエリでprop=pageimagesを使用します。

画像の説明も必要な場合は、APIクエリでprop=pageimages|pagetermsを代わりに使用します。

piprop=originalを使用して元の画像を取得できます。または、幅/高さを指定したサムネイル画像を取得できます。幅/高さ= 600のサムネイルの場合、piprop=thumbnail&pithumbsize=600。いずれかを省略すると、APIコールバックで返される画像は、デフォルトで幅/高さが50ピクセルのサムネイルになります。

JSON形式の結果をリクエストする場合、APIクエリで常にformatversion=2を使用する必要があります(つまり、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

サムネイルサイズ(600px幅/高さ)画像:

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

方法1:次のようなクエリを試すことができます。

http://en.wikipedia.org/w/api.php?action=opensearch&limit=5&format=xml&search=italy&namespace=

応答では、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 Parserhttp://simplehtmldom.sourceforge.net

私はあなたにそれを書く時間がありません。アドバイスをお願いします、ありがとう。

6
Giberno

main画像に関する具体的な質問に答えていないことを申し訳ありません。しかし、すべての画像のリストを取得するコードは次のとおりです。

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
)

2番目の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
)

2番目の配列の6番目の要素でURLが少し変更されていることに注意してください。 @JosephJaberが上記のコメントで警告していたことです。

これが誰かを助けることを願っています。

5
Óscar Palacios

ウィキペディアの記事タイトルでメイン画像(完全なURL)を取得するコードをいくつか作成しました。完璧ではありませんが、全体的には結果に非常に満足しています。

課題は、特定のタイトルを照会すると、Wikipediaが複数の画像ファイル名(パスなし)を返すことでした。さらに、二次検索(このスレッドに投稿されたコードvaratisを使用しました-ありがとう!)は、元の記事のタイトルに関係なく、検索された画像ファイル名に基づいて見つかったすべての画像のURLを返します。このすべての後、検索に関係のない一般的な画像になる可能性があるため、それらを除外します。このコードは、ファイル名とURLを繰り返して(うまくいけば最高の)一致を見つけます...少し複雑ですが、動作します:)

ジェネリックフィルターに関する注意:isGeneric()関数のジェネリックイメージ文字列のリストをコンパイルしてきましたが、リストは増え続けています。私はそれを公開リストとして維持することを検討しています-興味があれば私に知らせてください。

前:

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;
}

コメントを歓迎します。

5
vanwinter

Wikipediaページのメイン画像を確実に取得する方法があります-PageImagesと呼ばれる拡張機能

PageImages拡張機能は、ページで使用される画像に関する情報を収集します。

その目的は、記事に関連付けられた単一の最も適切なサムネイルを返すことであり、意味のある画像のみを返そうとします。メンテナンステンプレート、スタブ、またはフラグアイコンからのものではありません。現在、ページで使用されている最初の無意味な画像を使用しています。

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

APIクエリにpropページ画像を追加するだけです:

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

これにより、迷惑なデフォルト画像が確実に除外され、自分でそれらをフィルタリングする必要がなくなります!拡張機能は、すべてのメインWikipediaページにインストールされます...

3
Paul Weber

ページの例を見てみましょう http://en.wikipedia.org/wiki/index.html?curid=5757 Main Picを取得します

チェックアウト

prop = pageprops

action = query&pageids = 57570&prop = pageprops&format = 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_(crop).jpg **

画像ファイル名があるので、次のようにファイル名から完全な画像パスを取得するために別のApiコールを作成する必要があります

action = query&titles = Image:INSERT_EXAMPLE_FILE_NAME_HERE.jpg&prop = imageinfo&iiprop = url

例えば。

action = query&titles = Image:Sachin_at_Castrol_Golden_Spanner_Awards_(crop).jpg&prop = imageinfo&iiprop = url

http://upload.wikimedia.org/wikipedia/commons/3/35/Sachin_at_Castrol_Golden_Spanner_Awards_%28crop%29.jpg のようなURLを含む画像データの配列を返します=

1
Vineed

WikipediaのAPIに関するこの関連質問 を参照してください。ただし、APIを使用してサムネイル画像を取得できるかどうかはわかりません。

また、Webページを解析して画像URLを見つけ、その方法で画像を取得することもできます。

1
The Nail

前述のAnurajのように、pageimagesパラメーターはそれです。気の利いたものをもたらす次のURLを見てください。

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

彼女はいくつかの興味深いパラメータです:

  • 2つのパラメータextractsおよびexsentencesを使用すると、簡単な説明を使用できます。 (exsentencesは、抜粋に含める文の数です)
  • Infoおよびinprop = urlパラメーターは、ページのURLを提供します
  • Propプロパティには、バー記号で区切られた複数のパラメーターがあります
  • そして、そこにformat = jsonを挿入すると、さらに良い
1
netfed

私はそうは思いませんが、リンクパーサーHTMLドキュメントを使用して画像をキャプチャできます

0
user862010

ここに、私が見つけたXPathのリストがあり、記事の95%で動作します。主なものは1、2、3、4です。多くの記事は正しくフォーマットされておらず、これらはEdgeの場合です。

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";

Libxml2.2の周りにHppleというObjCラッパーを使用して、イメージのURLを引き出しました。お役に立てれば

0
Vlad