2009-06-24 102 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,你基本上是偷盜,應該會收到所有應有的禮貌...沒有。

免得你覺得我來看你,我要讓你知道我從經驗發言;)