如何使用 PHP 从 Wikipedia API 获取结果?

Posted

技术标签:

【中文标题】如何使用 PHP 从 Wikipedia API 获取结果?【英文标题】:How to get results from the Wikipedia API with PHP? 【发布时间】:2012-02-15 21:34:56 【问题描述】:

我可能不应该使用 file_get_contents() 我应该使用什么?我想保持简单。

警告:file_get_contents(http://en.wikipedia.org/w/api.php?action=query&titles=Your_Highness&prop=revisions&rvprop=content&rvsection=0):打开流失败:HTTP 请求失败! HTTP/1.0 403 禁止

【问题讨论】:

php.net/manual/en/book.curl.php 您可以使用 file_get_contents 来完成,但如果您喜欢它简单,请改用 cURL,因为您需要按照 API documentation 中的描述处理 cookie。 PHP native 和 cURL 方式都可以,但 cURL 更简单。 比 cURL 更好的是 HTTP_Request2,你可以通过 Pear 下载它,这是一个更好的体验,因为它是一个合适的 OO 库 @netcoder,只有你想登录才需要处理cookies。不是只需要访问它。 【参考方案1】:

您在此处遇到的问题与 MW API 的 User-Agent policy 有关 - 您必须提供 User-Agent 标头,并且该标头必须提供一些联系您的方式。

您可以使用file_get_contents() 和stream context 来做到这一点:

$opts = array('http' =>
  array(
    'user_agent' => 'MyBot/1.0 (http://www.mysite.com/)'
  )
);
$context = stream_context_create($opts);

$url = 'http://en.wikipedia.org/w/api.php?action=query&titles=Your_Highness&prop=revisions&rvprop=content&rvsection=0';
var_dump(file_get_contents($url, FALSE, $context));

话虽如此,使用cURL 可能被认为更“标准”,这肯定会给你更多的控制权:

$url = 'http://en.wikipedia.org/w/api.php?action=query&titles=Your_Highness&prop=revisions&rvprop=content&rvsection=0';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_USERAGENT, 'MyBot/1.0 (http://www.mysite.com/)');

$result = curl_exec($ch);

if (!$result) 
  exit('cURL Error: '.curl_error($ch));


var_dump($result);

【讨论】:

对问题的明确回答和“正确的方法”。先生回答得很好。【参考方案2】:

你真正收到的错误信息是

脚本应使用包含联系信息的用户代理字符串,否则它们可能会在不通知的情况下被 IP 阻止。

这意味着您在使用 API 时应提供有关您自己的其他详细信息。您对 file_get_contents 的使用确实发送了所需的用户代理。

这是 curl 中的一个工作示例,将自己标识为该问题的测试:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://en.wikipedia.org/w/api.php?action=query&titles=Your_Highness&prop=revisions&rvprop=content&rvsection=0&format=xml");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, "Testing for http://***.com/questions/8956331/how-to-get-results-from-the-wikipedia-api-with-php");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);

echo $result;
?>

【讨论】:

【参考方案3】:

file_get_contents 应该可以。

file_get_contents('http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=New_York_Yankees&rvprop=timestamp|user|comment|content')

这之前在 *** 上讨论过 here

还有一些好看的代码示例here

【讨论】:

好吧,如果 file_get_contents 能正常工作就好了,它似乎比我想象的要复杂【参考方案4】:

他们自己在 API 文档中说:

使用任何编程语言对该 URL 发出 HTTP GET 请求

您需要正确获取 URL,以下对我有用: http://en.wikipedia.org/w/api.php?format=json&action=query&titles=Main%20Page&prop=revisions&rvprop=content

据我所知,您没有指定输出格式!

【讨论】:

en.wikipedia.org/w/… 您的网址在添加输出格式后有效...

以上是关于如何使用 PHP 从 Wikipedia API 获取结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Wikipedia的API获取Wikipedia内容?

如何通过 API 从***获取地标地点的标题?

无法从 Wikipedia API 获取数据

从 Wikipedia 检索数据并使用 angularjs 显示它

利用wikipedia 的API实现对其内容的查询

使用 jQuery 的 MediaWiki API 没有响应