从外部获取网站内容的最佳方式

时间:2009-06-24 18:52:38

标签: java javascript html http web

有一个搜索网站,其搜索结果是由javascript动态生成的。因此,用户输入查询,并且站点在页面上显示内容,而不刷新。

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

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

显而易见的问题是该网站使用javasript而不是简单的HTML,因此发送URL请求并解析结果输出是行不通的(因为此页面的源代码总是只是对各种引用的一堆.js文件)。

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

3 个答案:

答案 0 :(得分:2)

除非搜索提供商为您提供API(通过反向渠道协议或公开提供的协议),否则您所做的任何事情都可能会持续很长时间。

你可能会竭尽全力欺骗网站,使其相信你是一个普通的网站用户。然后,他们会对他们的网站如何工作做一些小的改变(因为他们不知道有人以你的方式使用它),而且你的黑客突然间无法工作。稍后,他们可能会注意到您正在以这种方式使用它们,并检测您的使用情况并将其阻止。

基本上,除非他们给你一个API,否则你基本上是在偷窃,并且应该期望得到所有应得的礼貌......没有。

为免你认为我在评判你,我会告诉你我从经验中说话;)

答案 1 :(得分:0)

安装Firebug,研究网站javascript发出的请求,并在程序中模仿它们。机会是有一个需要做出的请求,结果会以一些很好的形式出现,如JSON

答案 2 :(得分:0)

Javascript的http请求几乎就像浏览器一样,一旦你弄清楚它们是什么,你可以尝试在perl / python / etc中重新创建它们。 使用Firefox + Firebug,您可以在“网络”面板中查看请求。

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


刚看了一眼,搜索了IBM,从Firebug获取了帖子数据,用'&'替换换行符并把它放在请求网址之后:

[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' });

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