这里是一篇我创建的博客文章,概述了整个过程:
http://jasonthomascarter.blogspot.com/2013/08/the-friendly-developers-guide-to.html
首先,我们将从 Windows Store 网站的 Robots.txt 文件开始。
http://apps.microsoft.com/robots.txt
网站使用 robots.txt 来指导网络爬虫如何行动,他们想让它们看到什么,以及不想让它们看到什么。
http://www.robotstxt.org/
网络机器人(也称为网络漫游者、爬虫或蜘蛛)是自动遍历网络的程序。搜索引擎如谷歌使用它们来索引网络内容,垃圾邮件发送者使用它们来扫描电子邮件地址,它们还有许多其他用途。
在这种情况下,我们感兴趣的是Sitemaps.xml索引文件。
http://apps.microsoft.com/windows/sitemap_index.xml
http://www.sitemaps.org/
站点地图是网站管理员向搜索引擎通报可供爬行的网站页面的简便方式。在其最简单的形式中,站点地图是一个XML文件,其中列出了站点的URL以及关于每个URL的其他元数据(它上次更新时间、它通常更改的频率以及与站点中的其他URL相比较时的重要性)以便搜索引擎更加智能地爬取站点。
站点地图索引文件列出了每个独立站点地图XML文件。截至本文撰写时,apps.microsoft.com网站有141个独立的站点地图XML文件。
在这些独立文件中,包含了数千个Windows Store应用程序的网页URL,例如PlayTo Receiver应用程序的URL。
http://apps.microsoft.com/windows/en-us/app/playto-receiver/72a6ba17-2d4e-4a1c-bcfb-cdc5d4b32d0e
这些应用程序的网页确实包含了我们可以从HTML中获取的大量信息,但我们可以做得更好......我们在这里得到的关键信息是应用程序ID以及这些ID在商店中发布到哪些地理位置。
例如:
72a6ba17-2d4e-4a1c-bcfb-cdc5d4b32d0e
和en-us等等...
现在让我们来看看有趣的东西,我们可以使用新发现的应用程序ID和地理信息调用一些网络服务。
https://services.apps.microsoft.com/browse/6.2.9200-1/615/en-US_en-US/c/US/cp/10005001/Apps/72a6ba17-2d4e-4a1c-bcfb-cdc5d4b32d0e
这个网络服务提供了大量信息,但元素名称并不清晰。以下是我对其中许多(但不是全部)元素的解释,以帮助您入门。
sSubCategoryName = rawXML.getElementsByTagName('Sc')[0].getElementsByTagName('N')[0].childNodes[0].nodeValue;
sSubCategoryId = rawXML.getElementsByTagName('Sc')[0].getElementsByTagName('I')[0].childNodes[0].nodeValue;
sHasTrial = rawXML.getElementsByTagName('Try')[0].childNodes[0].nodeValue;
sDescription = rawXML.getElementsByTagName('D')[0].childNodes[0].nodeValue;
sDeveloper = rawXML.getElementsByTagName('Dev')[0].childNodes[0].nodeValue;
sWebsite = rawXML.getElementsByTagName('Ws')[0].childNodes[0].nodeValue;
sSupport = rawXML.getElementsByTagName('Sws')[0].childNodes[0].nodeValue;
sPrivacy = rawXML.getElementsByTagName('Pu')[0].childNodes[0].nodeValue;
sCategoryName = rawXML.getElementsByTagName('C')[0].getElementsByTagName('N')[0].childNodes[0].nodeValue;
sCategoryId = rawXML.getElementsByTagName('C')[0].getElementsByTagName('I')[0].childNodes[0].nodeValue;
sPrice = rawXML.getElementsByTagName('P')[0].childNodes[0].nodeValue;
sForegroundColor = rawXML.getElementsByTagName('Fg')[0].childNodes[0].nodeValue;
sBackgroundColor = rawXML.getElementsByTagName('Bg')[0].childNodes[0].nodeValue;
sAppIcon = rawXML.getElementsByTagName('Ico')[0].childNodes[0].nodeValue;
sAppName = rawXML.getElementsByTagName('T')[0].childNodes[0].nodeValue;
sPackageFamilyName = rawXML.getElementsByTagName('Pfn')[0].childNodes[0].nodeValue;
sResourceId = rawXML.getElementsByTagName('R')[0].childNodes[0].nodeValue;
sId = rawXML.getElementsByTagName('I')[0].childNodes[0].nodeValue;
sCapabilities = sCapabilities + arrCapabilities[k].childNodes[0].nodeValue+",";
sUpdate = rawXML.getElementsByTagName('Ud')[0].childNodes[0].nodeValue;
sFeatures1 = rawXML.getElementsByTagName('Dbp')[0].childNodes[0].nodeValue;
sFeatures2 = rawXML.getElementsByTagName('Dbp')[1].childNodes[0].nodeValue;
sFeatures3 = rawXML.getElementsByTagName('Dbp')[2].childNodes[0].nodeValue;
sFeatures4 = rawXML.getElementsByTagName('Dbp')[3].childNodes[0].nodeValue;
sFeatures5 = rawXML.getElementsByTagName('Dbp')[4].childNodes[0].nodeValue;
sFeatures6 = rawXML.getElementsByTagName('Dbp')[5].childNodes[0].nodeValue;
sFeatures7 = rawXML.getElementsByTagName('Dbp')[6].childNodes[0].nodeValue;
sFeatures8 = rawXML.getElementsByTagName('Dbp')[7].childNodes[0].nodeValue;
sFeatures9 = rawXML.getElementsByTagName('Dbp')[8].childNodes[0].nodeValue;
sScreenshot1 = rawXML.getElementsByTagName('Ss')[0].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot2 = rawXML.getElementsByTagName('Ss')[1].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot3 = rawXML.getElementsByTagName('Ss')[2].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot4 = rawXML.getElementsByTagName('Ss')[3].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot5 = rawXML.getElementsByTagName('Ss')[4].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot6 = rawXML.getElementsByTagName('Ss')[5].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot7 = rawXML.getElementsByTagName('Ss')[6].getElementsByTagName('U')[0].childNodes[0].nodeValue
这段代码是从一个XML文件中获取特定节点的值,并将其分配给相应的变量。其中,getElementsByTagName()方法用于获取指定标签名的元素列表,childNodes[0]用于获取第一个子节点,nodeValue属性用于获取节点的值。
sScreenshot8 = rawXML.getElementsByTagName('Ss')[7].getElementsByTagName('U')[0].childNodes[0].nodeValue
sScreenshot9 = rawXML.getElementsByTagName('Ss')[8].getElementsByTagName('U')[0].childNodes[0].nodeValue
sCaption1 = rawXML.getElementsByTagName('Ss')[0].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption2 = rawXML.getElementsByTagName('Ss')[1].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption3 = rawXML.getElementsByTagName('Ss')[2].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption4 = rawXML.getElementsByTagName('Ss')[3].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption5 = rawXML.getElementsByTagName('Ss')[4].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption6 = rawXML.getElementsByTagName('Ss')[5].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption7 = rawXML.getElementsByTagName('Ss')[6].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
sCaption8 = rawXML.getElementsByTagName('Ss')[7].getElementsByTagName('Cap')[0].childNodes[0].nodeValue
这段文本是一段JavaScript代码,其中通过获取XML文档中的元素标签和节点值来赋值给变量。
Windows Store不仅仅是应用程序,还有很多评论。目前Windows Store中的应用程序已经有超过210,000条评论。这些评论来自世界各地,因此您需要一些国家代码、方便的应用程序ID,并注意到末尾的pn/1,您会发现此服务每页仅返回10条评论,只需将此值递增为pn/2,pn/3等,直到您没有评论为止。
var arrCounntryCodes = ["AE", "AR", "AT", "AU", "BE", "BG", "BH", "CA", "CH", "CL", "CN", "CO", "CR", "CY", "CZ", "DE", "DK", "DZ", "EE", "EG", "ES", "FI", "FR", "GB", "GR", "HK", "HR", "HU", "ID", "IE", "IL", "IN", "IQ", "IT", "JO", "JP", "KW", "KZ", "LB", "LK", "LT", "LU", "LV", "LY", "MA", "MT", "MX", "MY", "NL", "NO", "NZ", "OM", "PE", "PH", "PK", "PL", "QA", "RO", "RS", "RU", "SA", "SE", "SG", "SI", "SK", "TH", "TN", "TR", "TT", "UA", "US", "UY", "VE", "VN"];
这是一个包含多个国家代码的数组。
https://services.apps.microsoft.com/4R/6.2.9200-1/1/en-US/m/US/Apps/f514d64b-8705-43b7-a400-c4f4f3dedfc0/Reviews/all/s/date/1/pn/1
这段话更详细地列出了元素名称,因此我认为不需要进一步解释。您可以看到完整名称、显示名称和用户选择用来代表自己的图像。
接下来我们可以进行一些搜索...
在这里又变得有点神秘了,但是现在您应该已经习惯了。您可以从I元素中获取应用程序ID,然后从那里返回浏览服务f514d64b-8705-43b7-a400-c4f4f3dedfc0。
链接:
https://services.apps.microsoft.com/search/6.2.9200-1/615/en-US_en-US/m/US/c/US/il/en-US/cp/10005001/query/cid/0/pf/1/pc/0/pt/x64/af/0/lf/0/s/0/2/pn/0?phrase=Software Developer。
所以,这就是从Windows Store中提取大量信息的基础知识,然后您可以随心所欲地处理这些信息。如果您觉得这很有用和/或使用这些信息制作一些应用程序,并有其他额外信息要分享,请在评论中让我知道。