通过API访问wikipedia页面的主要图片

有什么办法可以通过API访问任何维基百科页面的缩略图吗? 我的意思是右上方框中的图像。 有没有什么API?

http://en.wikipedia.org/w/api.php

看看prop=images

它返回在parsing的页面中使用的图像文件名的数组。 然后,您可以select另一个API调用来查找完整的图像URL,例如: action=query&titles=Image:INSERT_EXAMPLE_FILE_NAME_HERE.jpg&prop=imageinfo&iiprop=url

或者通过文件名的散列来计算URL 。

不幸的是,虽然prop=images images返回的图像数组是按照它们在页面上的顺序排列的,但是第一个不能保证是信息框中的图像,因为有时一个页面会在信息框之前包含一个图像(大多数的关于页面的元数据的时间图标:例如“这篇文章被locking”)。

search包含页面标题的第一个图像的图像arrays可能是信息框图像的最佳猜测。

您可以使用prop=pageimages获得任何维基百科页面的缩略图。 例如:

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

你会得到缩略图完整的url。

方法1:你可以尝试一下这样的查询:

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

在回应中,你可以看到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 Parser一样PHP Simple HTML DOM Parser http://simplehtmldom.sourceforge.net

我没有时间写给你。 只是给你一些build议,谢谢。

对于没有具体回答你关于主要形象的问题,我感到抱歉。 但是这里有一些代码来获取所有图像的列表:

 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 ) 

而对于第二个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 ) 

请注意,URL在第二个数组的第六个元素上发生了一些变化。 这是@JosephJaber在他上面的评论中所警告的。

希望这有助于某人。

我已经写了一些代码,获取主要图像(完整的URL)的维基百科文章标题。 这并不完美,但总的来说,我对结果非常满意。

挑战在于,当查询特定标题时,维基百科会返回多个图像文件名(无path)。 此外,二级search(我使用的代码varatis张贴在这个线程 – 谢谢!)返回基于search的图像文件名find的所有图像的URL,无论原来的文章标题。 毕竟,我们可能会得到一个与search无关的通用图像,所以我们将其过滤掉。 代码遍历文件名和URL,直到它find(希望最好)匹配…有点复杂,但它的工作:)

关于通用filter的注意事项:我一直在编译isGeneric()函数的通用图像string列表,但列表只是不断增长。 我正在考虑把它作为一个公开的名单 – 如果有任何兴趣让我知道。

上一篇:

 protected static $baseurl = "http://en.wikipedia.org/w/api.php"; 

主要function – 从标题获取图片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; } 

评论欢迎。

我有一种方法可靠地获取维基百科页面的主图像 – 名为PageImages的扩展名

PageImages扩展收集有关页面上使用的图像的信息。

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

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

只需将您的API页面图像添加到您的API查询:

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

这可靠地过滤出恼人的默认图像,并防止您必须自己过滤它们! 该扩展程序安装在所有主要的维基百科页面上

查看MediaWiki API示例获取维基百科页面的主要图片: https ://www.mediawiki.org/wiki/API: Page_info_in_search_results 。

正如其他人所提到的,您可以在您的API查询中使用prop=pageimages

如果您还想要图像说明,则可以在您的API查询中使用prop=pageimages|pageterms

您可以使用piprop=original获取原始图像。 或者你可以得到一个指定宽度/高度的缩略图。 对于width / height = 600的piprop=thumbnail&pithumbsize=600piprop=thumbnail&pithumbsize=600 。 如果您忽略其中一个,则在APIcallback中返回的图像将默认为宽度/高度为50px的缩略图。

如果以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 

在维基百科的API上查看这个相关的问题 。 但是,我不知道是否可以通过API检索缩略图。

您也可以考虑parsing网页来查找图像的URL,并以这种方式检索图像。

让我们以http://en.wikipedia.org/wiki/index.html?curid=57570的页面为例来获取主图片;

查看

丙= pageprops

行动=查询&pageids = 57570&丙= pageprops&格式= 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" } } } }} 

这里是我find的95%的文章的XPath的列表。 主要是1,2 3和4.许多文章格式不正确,这将是边缘情况:

您可以使用DOMparsing库来使用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。 希望这可以帮助

我认为不是,但是可以使用链接parsing器HTML文件捕捉图像

像Anuraj提到的,pageimages参数就是它。 看看下面的URL会带来一些漂亮的东西:

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

她有一些有趣的参数:

  • 这两个参数提取exsentences给你一个简短的描述,你可以使用。 (exsentences是你想要在摘录中包含的句子的数量)
  • info和inprop = url参数为您提供页面的url
  • prop属性有多个由条形符号分隔的参数
  • 如果你在里面插入format = json ,那就更好了