有一个搜索网站,它的搜索结果是由javascript动态生成的。因此,用户输入查询,站点在页面上显示内容,而不进行刷新。
我需要以编程方式获取这些搜索结果(比如从Java程序或perl/python脚本)。
因此,理想情况下,我可以使用100个查询作为用户输入启动我的程序,然后程序会在每个查询中访问该网站,并在我的屏幕上显示该网站返回的所有搜索结果。
明显的问题是,站点是用javasript而不是简单的HTML编写的,所以发送一个URL请求并解析结果输出是行不通的(因为这个页面的源代码总是一堆对各种.js文件的引用)。
考虑到上述条件,我有哪些选择?
发布于 2009-06-24 19:00:50
Javascript处理http请求几乎就像浏览器一样,一旦你弄清楚它们是什么,你可以尝试在perl/python/等中重新创建它们。使用Firefox+Firebug,你可以在“Net”面板中看到请求。
你可能需要考虑的是用户代理字符串,cookie,有时返回的数据是由Javascript运行/解释的,等等。也许你选择的语言有一个不错的httpbrowser类可以使用?
只要看一看,搜索IBM,从Firebug中获取post数据,将换行符替换为'&‘,并将其放在请求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?
发布于 2009-06-24 18:59:00
除非搜索提供商给你一个可以使用的API (无论是通过反向通道协议还是公开可用的协议),否则你所做的任何事情都不可能持续很长时间。
你可能会不遗余力地欺骗网站,让他们相信你是一个普通的网站用户。然后,他们会对他们的网站的工作方式做一些小的改变(因为他们不知道有人在以你的方式使用它),突然你的黑客攻击就不起作用了。过一段时间,他们可能会注意到你正在以这种方式使用它们,并检测到你的使用情况并完全阻止它。
基本上,除非他们给你一个API,否则你基本上是在偷窃,并且应该期待得到所有应得的礼貌……没有。
以免你认为我在评判你,我会让你知道我是凭经验说的;)
发布于 2009-06-24 18:58:14
安装Firebug,研究站点的javascript发出的请求,并在您的程序中模拟它们。有可能只需要发出一个请求,结果就会以JSON这样的形式出现
https://stackoverflow.com/questions/1040228
复制相似问题