【问题标题】:How to get the first image of any wiki page如何获取任何 wiki 页面的第一张图片
【发布时间】:2012-04-20 14:47:41
【问题描述】:

我需要在任何给定的 wiki 页面中获取第一个图像/主图像。我可以使用抓取工具来做到这一点。但我正在使用 curl 来废弃页面。但可能是由于互联网连接速度较慢,仅废弃一个 wiki 页面需要很长时间。除此之外,我需要根据用户的查询同时显示至少 7-8 个不同的 wiki 图像。

因此,为此使用 curl 毫无意义。 我试过wiki api

https://en.wikipedia.org/w/api.php?action=query&titles=India&prop=images&imlimit=1

但是我没有其他参数可以给这个列表排序。通常,此 api 返回的第一张图片不是您在页面顶部看到的主图片。有时图像与页面上下文的距离太远。

我只需要为每个 wiki 标题显示一张图片。提前致谢。

【问题讨论】:

  • 嗯,您是否查看过 API,还有哪些其他可能的方式?通常有比这更多的选择。
  • 你真的是指任何维基页面吗?或者您是否将您的要求限制在 wikimedia wiki(根据标签)?或者您是否将您的要求限制在维基百科(根据示例)?

标签: php mediawiki wikimedia


【解决方案1】:

要经常很好地猜测“主图像”,请使用prop=pageimages,由MediaWiki extension "PageImages" 提供:

PageImages 扩展收集有关在 页面。

它的目的是返回一个最合适的相关缩略图 与一篇文章,试图只返回有意义的图像,例如不是 来自维护模板、存根或标志图标的那些。目前它 使用页面中使用的第一个无意义的图像。

(文字为cc-by-sa 3.0list of authors

用法

引用MediaWiki API documentation

返回有关页面上图像的信息,例如缩略图和 照片的存在。 参数: piprop 返回哪些信息: 缩略图 与页面关联的图像的 URL 和尺寸(如果有)。 姓名 图片标题。 值(用“|”分隔):缩略图、名称 默认值:缩略图|名称 小拇指大小 最大缩略图尺寸。 默认值:50 限制 返回多少页的属性。 不超过 50 个(机器人为 100 个)。 默认值:1 继续 当有更多结果可用时,使用它继续。

示例

https://en.wikipedia.org/w/api.php?action=query&titles=India&prop=pageimages&pithumbsize=300

返回值:

{
    "query": {
        "pages": {
            "14533": {
                "pageid": 14533,
                "ns": 0,
                "title": "India",
                "thumbnail": {
                    "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Political_map_of_India_EN.svg/256px-Political_map_of_India_EN.svg.png",
                    "width": 256,
                    "height": 300
                },
                "pageimage": "Political_map_of_India_EN.svg"
            }
        }
    }
}

更多示例:

【讨论】:

  • 只是想写个简短的便条表示感谢 - 你的帖子只是帮助我弄清楚了一些事情。
【解决方案2】:
api.php?action=query&titles=India&prop=images

为您提供按字母顺序排列的所有图像的完整列表。您可以从非api页面上的文档顺序中检索第一张图像。如果你将两者结合起来,你可能会得到最大的收益:

$topic = 'India';
$url = sprintf('http://en.wikipedia.org/wiki/%s', urlencode($topic));
$options = array(
    'http' => array(
        'user_agent' => 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:50',
    )
);
$context = stream_context_create($options);
libxml_set_streams_context($context);
$doc = new DOMDocument();
$doc->loadHTMLFile($url);
$xp = new DOMXPath($doc);
$result = $xp->query('(//img[@class = "thumbimage"])[1]');
$image = ($result && $result->length) ? $result->item(0) : NULL;
echo $doc->saveXML($image), "\n";

【讨论】:

  • 正如我所说,我不想从页面中删除,因为它们很笨重,而且我必须立即处理多达 10 页。请阅读我的问题的前两行。
  • 体积大?通常,由于 DOMDocument,它们可以快速访问并且解析变得轻而易举。你也可以做缓存。
  • 我在使用这个脚本时遇到了一些错误。当我将类更改为“图像”时,我也得到了整个页面。我每次得到的错误是这个警告:DOMDocument::loadHTMLFile(): ID CITEREFInternational_Monetary_Fund_2011 已经在en.wikipedia.org/wiki/India 中定义,行:1325 in /var/www/wiki.php on line 18 警告:DOMDocument::loadHTMLFile( ): ID CITEREFKuiper2010 已经定义在en.wikipedia.org/wiki/India, line: 1395 in /var/www/wiki.php on line 18。不要介意行号
  • 您可能会收到有关重复 ID 的警告,那是因为 HTMl 源不符合标准,请使用 libxml_use_internal_errors 来控制该行为。
【解决方案3】:

似乎图像是按字母顺序返回的……很奇怪。

无论如何,这可能会更好:

https://en.wikipedia.org/w/api.php?action=parse&text={{Barack_Obama}}&prop=images

不幸的是,只有第一张图片可用,但至少它是正确的。

【讨论】:

    【解决方案4】:
    $wikipage = file_get_contents('http://en.wikipedia.org/wiki/Cats');
    preg_match_all('/<img[^<]+?>/', $wikipage, $matches);
    

    通常主图像将是锁定之后的第二个匹配项 (http://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Padlock-silver.svg/20px-Padlock-silver.svg .png)

    【讨论】:

    • 正如我所说,我不想从页面中删除,因为它们很笨重,我必须立即完成多达 10 页。请阅读我的问题的前两行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    相关资源
    最近更新 更多