我想编写一些代码来查看网站及其资产,并创建一些统计信息和报告。资产将包括图像。我希望能够跟踪链接,或者至少尝试识别页面上的菜单。我还想根据类名等来猜测CMS创建网站的内容。
我将假设该网站相当静态,或者由CMS驱动,但不像RIA。
关于我如何进步的想法。
1)将网站加载到iFrame中。这很好,因为我可以用jQuery解析它。或者我可以吗?好像我受到跨站点脚本规则的阻碍。我已经看到了解决这些问题的建议,但我认为浏览器会继续限制这些问题。书签有用吗?
2)Firefox附加组件。这可以让我解决跨站点脚本问题,对吧?似乎可行,因为Firefox(以及GreaseMonkey)的调试工具可以让你做各种各样的事情。
3)抓住服务器端的站点。使用服务器上的库进行解析。
4)YQL。这不是为解析网站而构建的吗?
答案 0 :(得分:7)
我的建议是:
a)选择脚本语言。我建议使用Perl或Python:curl + bash但是没有异常处理。
b)使用python或perl库通过脚本加载主页。 试试Perl WWW::Mechanize模块。
Python有很多内置模块,请查看www.feedparser.org
c)检查服务器标头(通过HTTP HEAD命令)以查找应用程序服务器名称。如果幸运的话,您还可以找到CMS名称(i.d.WordPress等)。
d)使用Google XML API询问类似“link:sitedomain.com”的内容,找出指向该网站的链接:再次,您将在google主页上找到Python的代码示例。同时向Google提出域名排名也很有帮助。
e)您可以在SQLite数据库中收集数据,然后在Excel中进行后处理。
答案 1 :(得分:3)
您应该只需获取源(XHTML / HTML)并解析它。你几乎可以用任何现代编程语言来做到这一点。从您自己的计算机连接到Internet。
iframe是用于显示HTML内容的小部件,它不是用于数据分析的技术。您可以分析数据而无需在任何地方显示。你甚至不需要浏览器。
Python,Java,PHP等语言中的工具对于您的任务而言肯定比Javascript或这些Firefox扩展中的任何功能更强大。
网站背后的技术也无关紧要。无论浏览器如何渲染,XHTML / HTML都只是一串字符。要查找“资产”,您只需查找特定的HTML标记,例如“img”,“object”等。
答案 2 :(得分:3)
答案 3 :(得分:3)
我建议你首先尝试#4选项(YQL): 原因在于它看起来可能会为您提供所需的所有数据,然后您可以将您的工具构建为网站或其中您可以获取有关网站的信息而无需实际访问浏览器中的页面。如果YQL适用于您所需的内容,那么看起来您可以使用此选项获得最大的灵活性。
如果YQL没有成功,那么我建议你选择#2(firefox插件)。
我认为您应该尝试并远离选项#1(Iframe),因为您已经了解了跨站点脚本问题。
此外,我使用了选项#3(在服务器端抓住网站),我过去遇到的一个问题是在使用AJAX调用之后抓取加载内容的网站。当时我没有找到一个很好的方法来获取使用AJAX的页面的全部内容 - 所以请注意这个障碍!这里的其他人也遇到了这个问题,请看:Scrape a dynamic website
AJAX动态内容问题 ajax问题可能有一些解决方案,例如使用AJAX本身来获取内容并使用evalScripts:true参数。请参阅以下文章以获取更多信息以及您可能需要了解的问题,以及从被抓取的内容中评估的javascript如何工作:
原型库:http://www.prototypejs.org/api/ajax/updater
留言板:http://www.crackajax.net/forums/index.php?action=vthread&forum=3&topic=17
或者如果你愿意花钱,看看这个: http://aptana.com/jaxer/guide/develop_sandbox.html
这是一个丑陋(但可能有用)的例子,它使用名为WebRobot的.NET组件来废弃动态支持AJAX的站点(如Digg.com)中的内容。 http://www.vbdotnetheaven.com/UploadFile/fsjr/ajaxwebscraping09072006000229AM/ajaxwebscraping.aspx
此处还有一篇关于使用PHP和Curl库来删除网页中所有链接的一般文章。但是,我不确定本文和Curl库是否涵盖了AJAX内容问题: http://www.merchantos.com/makebeta/php/scraping-links-with-php/
我刚想到的一件事可能有用:
^注意:如果保存本地版本,您将需要使用正则表达式来转换相对链接路径(尤其是图像)是正确的。
祝你好运! 请注意AJAX问题。现在许多站点使用AJAX动态加载内容。 Digg.com,MSN.com为它的新闻提供等...答案 4 :(得分:2)
这实际上取决于项目的规模。如果它只是随意的,而不是完全自动化的,我强烈建议使用Firefox Addon。
我正处于类似项目的中间。它必须分析使用Javascript生成的页面的DOM。编写服务器端浏览器太困难了,所以我们转向其他一些技术:Adobe AIR,Firefox Addons,用户脚本等。
如果您不需要自动化,Fx插件很棒。脚本可以分析页面,显示结果,要求您更正部件,不确定并最终将数据发布到某些后端。您可以访问所有DOM,因此您不需要编写JS / CSS / HTML /任何解析器(这将是一份工作!)
另一种方式是Adobe AIR。在这里,您可以更好地控制应用程序 - 您可以在后台启动它,无需交互即可进行所有解析和分析。缺点是 - 您无法访问所有页面的DOM。传递这个的唯一方法是设置一个简单的代理,它获取目标URL,添加一些Javascript(以创建一个受信任的不受信任的沙箱桥)...这是一个肮脏的黑客,但它的工作原理。
编辑: 在Adobe AIR中,有两种方法可以访问外部网站的DOM:
loadString
方法IIRC)我不记得为什么,但第一种方法对我来说失败了,所以我不得不使用另一种方法(我认为有一些安全原因,我无法解决)。我必须创建一个沙箱,以访问网站的DOM。这里有一点关于dealing with sandbox bridges。我们的想法是创建一个代理,它添加一个简单的JS,创建childSandboxBridge
并向父代公开一些方法(在本例中为AIR应用程序)。脚本内容类似于:
window.childSandboxBridge = {
// ... some methods returning data
}
(小心 - 通过沙箱桥传递的内容有局限性 - 当然没有复杂的对象!只使用基元类型)
因此,代理基本上篡改了返回HTML或XHTML的所有请求。所有其他的都没有改变。我已经使用Apache + PHP完成了这项工作,但可以通过一些真正的代理来完成,其中包含一些插件/自定义模块。这样我就可以访问任何网站的DOM。
编辑结束。
我所知道的第三种方式,最难的方式 - 建立一个类似browsershots上的环境。然后你使用firefox自动化。如果您在服务器上安装了Mac OS X,则可以使用ActionScript进行自动化操作。
答案 5 :(得分:0)
如今,作为一名.Net程序员,我的建议是使用C#或其他语言与.Net绑定。使用WebBrowser控件加载页面,然后遍历文档中的元素(通过GetElementsByTagName())以获取链接,图像等。通过一些额外的工作(解析BASE标记,如果可用),您可以将src和href属性解析为URL,并使用HttpWebRequest发送目标图像的HEAD请求以确定其大小。这应该让您了解页面的图形密集程度,如果这是您感兴趣的内容。您可能感兴趣的其他项目可能包括反向链接/ pagerank(通过Google API),无论页面是{{ 3}},有多少百分比的链接链接到同一域中的URL而不是异地,并且如果可能的话,链接用于各种搜索字符串的页面的排名(尽管如果这是以编程方式提供的话)。
答案 6 :(得分:0)
我会使用一种语言编写的脚本(或根据所选语言编译的应用程序),该语言对网络和文本解析/正则表达式有很强的支持。
你最熟悉的语言。基本的独立脚本/应用程序使您无需过多担心浏览器集成和安全问题。