如何使用 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内容?