如何通过Wikipedia API在一个geosearch调用中获得更多信息?

时间:2014-07-02 11:23:29

标签: api wikipedia-api

我正在使用类似于http://en.wikipedia.org/w/api.php?action=query&list=geosearch&gsradius=10000&gscoord=41.426140|26.099319的API调用。

我会返回类似这样的内容

<?xml version="1.0"?>
<api>
  <query>
    <geosearch>
      <gs pageid="27460829" ns="0" title="Kostilkovo" lat="41.416666666667" lon="26.05" dist="4245.1" primary="" />
      <gs pageid="27460781" ns="0" title="Belopolyane" lat="41.45" lon="26.15" dist="4988.7" primary="" />
      <gs pageid="27460862" ns="0" title="Siv Kladenets" lat="41.416666666667" lon="26.166666666667" dist="5713.5" primary="" />
      <gs pageid="13811116" ns="0" title="Svirachi" lat="41.483333333333" lon="26.116666666667" dist="6521.9" primary="" />
      <gs pageid="27460810" ns="0" title="Gorno Lukovo" lat="41.366666666667" lon="26.1" dist="6613.4" primary="" />
      <gs pageid="27460799" ns="0" title="Dolno Lukovo" lat="41.366666666667" lon="26.083333333333" dist="6746.2" primary="" />
      <gs pageid="27460827" ns="0" title="Kondovo" lat="41.433333333333" lon="26.016666666667" dist="6937" primary="" />
      <gs pageid="27460848" ns="0" title="Plevun" lat="41.45" lon="26.016666666667" dist="7383.1" primary="" />
      <gs pageid="24179704" ns="0" title="Villa Armira" lat="41.499069444444" lon="26.106263888889" dist="8130" primary="" />
      <gs pageid="27460871" ns="0" title="Zhelezari" lat="41.413333333333" lon="25.998333333333" dist="8540.1" primary="" />
    </geosearch>
  </query>
</api>

但是,虽然我实际上想要获得这些页面的一些照片,但是需要后续调用,例如

  • 获取一些页面图像

    http://en.wikipedia.org/w/api.php?action=query&prop=images&pageids=13843906

  • 然后,获取图片信息

    http://en.wikipedia.org/w/api.php?action=query&titles=File:Alexandru_Ioan_Cuza_Dealul_Patriarhiei.jpg&prop=imageinfo&iiprop=url

好吧,即使这让我得到了我最终需要的东西,它根本就没有效率。

我想知道这些呼叫是否有一些参数,或者可能完全是其他呼叫,这些呼叫会在最多2步/呼叫中带来所有这些信息。但是,如果它只有一个,那就太好了。

2 个答案:

答案 0 :(得分:4)

哇,我不知道现在such a feature存在!但要回答您的问题,因为它是list查询,您可以将其用作generator

让我们试一试:

prop=images查询也可以用作生成器,因此您也可以这样做:

唉,AFAIK你不能嵌套生成器,所以你不能在一个查询中执行这两个步骤。你可以:

  1. 在一个查询中获取图像列表,然后使用另一个查询来获取URL,或
  2. 从基本geosearch查询开始获取页面ID,然后在另一个查询中获取图像及其URL。
  3. 唉,事实证明,这两个选项都无法为您提供您可能想要的信息。如果您使用list=geosearch作为生成器,则无法获得您可能需要的坐标信息。希望在地图上显示结果。另一方面,使用prop=images作为生成器会让你错过更重要的事情:知道在哪些页面上使用哪些图像!

    因此,不幸的是,似乎如果您的目标是将图像放在地图上,您可能需要使用三个单独的查询来完成。至少您仍然可以在一个请求中查询多个页面/图像,因此您不需要更多而不是三个(直到您达到查询限制并需要使用continuations,是)。

    (此外,通过三个步骤执行此操作,您可以在第三步之前对图像应用一些过滤。例如,示例查询返回的大多数页面只有三个相同的图像 - Flag of Bulgaria.svg,{ {3}}和Ivaylovgrad Reservoir.jpg - 所有这些都是通过模板使用的,其中没有一个看起来像是表示特定位置的好选择。)

    Ps。如果您只是想在特定位置附近找到图片,即使他们没有在任何特定维基百科文章中使用过,您也可以尝试使用geosearch直接在Oblast Khaskovo.png。它似乎没有返回保加利亚示例坐标的任何结果,但Wikimedia Commons中的works just fine

答案 1 :(得分:1)

以下是基于上一个答案的替代方案。如果您将此查询作为部分答案开始:

https://en.wikipedia.org/w/api.php?action=query&prop=images&imlimit=max&generator=geosearch&ggsradius=10000&ggscoord=41.426140|26.099319

然后您可以在此基础上构建以在单个查询中获取信息。 pageimages属性可以与生成器一起使用。您不能嵌套生成器,但可以链接属性。查询可以使用pageimages来获取每个geosearch结果的页面主图像URL。它看起来像这样:

https://en.wikipedia.org/w/api.php?action=query&prop=images|pageimages&pilimit=max&piprop=thumbnail&iwurl=&imlimit=max&generator=geosearch&ggsradius=10000&ggscoord=41.426140|26.099319

此查询返回图像&#34;文件&#34;名称(图像属性)和主图像的单个URL(pageimages属性)。页面的主要图像是我所需要的。您可以推断&#34;文件&#34; url将文件中的更改与查询输出的url相匹配,但我不能推荐这样的hack。

images属性有一个设置,应该返回interwiki链接的网址,iwurl。我看到&#34;文件&#34;作为一个interwiki链接。此参数不起作用,图像不返回网址。在沙箱上玩可能会引导您找到更好的答案。

直观地看起来你应该能够将图像和imageinfo属性链接在一起。这样做并不能给出预期的结果。

如果页面主图像的单个网址不够,我可以鼓励您在API沙箱中玩,尝试使用某些属性组合来获取所需内容。我正在使用geosearch生成器并获取页面图像,文本描述和纬度/经度坐标,以便我可以获取地址。祝你好运!