2009-06-24 107 views
0

有一个搜索结果由动态地产生搜索结果。因此,用户输入一个查询,该站点将在页面上显示内容,而不会刷新。从外部获取网站内容的最佳方法

我需要以编程方式获取这些搜索结果(例如从Java程序或perl/python脚本中获取)。

因此理想情况下,我可以用100个查询作为用户输入启动我的程序,然后程序会打的网站,每个查询吐出我的屏幕上的所有搜索结果中的网站返回。

显而易见的问题是,该网站是在javasript而不是简单的HTML,所以发送一个URL请求和解析结果输出是不会工作的(因为这个页面的源代码总是只是一堆引用各种.js文件)。

鉴于上述条件,我有什么选择?

+0

几乎所有的搜索提供者都有一些API,但免费的搜索引擎会对您搜索的频率,一天中的多少次以及您获得的结果数量施加一些限制。 – akarnokd 2009-06-24 18:54:03

+0

此网站没有API。并且假设对于我可以做多少次或多久进行一次搜索没有限制。 – Saobi 2009-06-24 18:55:17

+0

您可以提供一些关于您想要用于搜索的网站的提示吗?如果搜索是本地搜索,则可以要求公开的API搜索提供程序仅在此网站中进行搜索。 – akarnokd 2009-06-24 19:56:34

回答

0

JavaScript并HTTP请求几乎就像一个浏览器,一旦你搞清楚它们是什么,你可以尝试在perl/python/etc中重新创建它们。 使用Firefox + Firebug,您可以在'Net'面板中看到请求。

你可能要考虑的事情是用户代理字符串,cookies,有时返回的数据是由Javascript运行/解释等等。也许你选择的语言有一个很好的httpbrowser类,你可以使用?


刚接过来一看,搜索IBM,从萤火虫走马上任的数据,与“&”更换新行,并把它请求的URL后:

[http://bcode.bloomberg.com/sym/dwr/call/plaincall/searchMgr.search.dwr?callCount=1&windowName=&c0-scriptName=searchMgr&c0-methodName=search&c0-id=0&c0-e1=string:ibm&c0-e2=string:&c0-e3=number:100&c0-e4=number:0&c0-e5=boolean:false&c0-param0=Object_SearchCriteria:{search:reference:c0-e1,%20filter:reference:c0-e2,%20limit:reference:c0-e3&,%20start:reference:c0-e4,%20allSources:reference:c0-e5}&batchId=4&page=%2Fsym%2F&httpSessionId=&scriptSessionId=FBC68693A4E1BC08D6E0DDFBDF6D0860] 

但它返回

throw 'allowScriptTagRemoting is false.'; 
//#DWR-REPLY 
if (window.dwr) dwr.engine.remote.handleBatchException({ name:'java.lang.SecurityException', message:'GET Disallowed' }); 
else if (window.parent.dwr) window.parent.dwr.engine.remote.handleBatchException({ name:'java.lang.SecurityException', message:'GET Disallowed' }); 

并且没有数据。所以看起来你必须编写一个post请求。看看他们的限制和指导方针,也许你应该联系并询问是否有公共API?

0

安装Firebug,研究由网站的JavaScript制作的请求,并在您的程序中模仿它们。机会是有一个单一的请求,需要进行和resulds会以一些不错的形式,如JSON

2

除非搜索提供商给你一个API的工作(通过backchannel协议或公众可用),那么你做的任何事情都不可能长时间工作。

你可能会付出巨大的努力来欺骗网站,使其相信你是一个普通的网站用户。然后,他们会对他们的网站的工作方式做一些小的改动(因为他们不知道有人正在以你的方式使用它),突然间你的黑客将无法工作。过了一段时间,他们可能会注意到您正在以这种方式使用它们,并检测到您的使用情况并将其屏蔽掉。

基本上,除非他们给你一个API,你基本上是偷盗,应该会收到所有应有的礼貌...没有。

免得你觉得我来看你,我要让你知道我从经验发言;)