FetchURL是SAE為開發者提供的分散式網頁抓取服務,用來同步的抓取http頁面,FetchURL針對國內的網路的做了最佳化,內部有調度系統,儘可能保證用戶快速的抓取到目標頁面
基本介紹
- 中文名:FetchURL
- 定義:分散式網頁抓取服務
- 類別:網路服務
- 作用:保證用戶快速的抓取到目標頁面
簡介,套用場景,服務限制與配額,服務限制,分鐘配額,PHP使用指南,抓取頁面,發起POST請求,錯誤碼參考,Java調用方式,本地環境使用,使用範例,抓取網頁,傳送請求,
簡介
FetchURL是SAE為開發者提供的分散式網頁抓取服務,用來同步的抓取http頁面,FetchURL針對國內的網路的做了最佳化,內部有調度系統,儘可能保證用戶快速的抓取到目標頁面
特別說明:SAE已經完全兼容cURL模組(內部用FetchURL實現),所以用戶可以使用cURL*函式進行HTTP請求,兼容用戶以往的使用習慣,使用戶的學習成本降為零。所以我們推薦用戶使用cURL*函式,以下關於FetchURL的文檔僅供老用戶參考。
。在SAE上使用FetchURL非常簡單,只需要調用sae_std_lib中的幾個簡單的函式即可。但需要特別注意的是,為了平台安全性,SAE對FetchURL做了一些限制:
http連線逾時<=5秒
send逾時<=15秒
read逾時<=20秒
http header禁用項:Content-Length、Vary、Via、X-Forwarded-For、FetchUrl、AccessKey、TimeStamp、Signature、AllowTruncated、ConnectTimeout、SendTimeout、ReadTimeout
另外,SAE規定FetchURL的user-agent默認包含SAE/fetchurl-accesskey,其中accesskey是用戶的accesskey,用戶可以自行添加 user-agent。Referer用戶也可以自行定義。
套用場景
FetchURL適用的場景主要有:
1、抓取http資源
2、傳送http rest請求
3、FetchURL支持https,並且支持重定向
服務限制與配額
SAE設定服務限制和配額的目的是為了防止個別用戶攻擊和濫用,從而在公有雲計算平台上保證絕大多數開發者的正常使用.
1、服務限制和配額設定是在入口網站新浪自身長期運維的基礎上經過嚴格計算得出的,所以正常使用一般不會出現問題。經過SAE 實際統計,99%的套用不會受到任何影響
2、當您發現您的某項服務超過限制或者超配時,請先閱讀相關文檔確認限制和配額的具體數值,再檢查自己的程式是否存在使用不當的情況,如果仍然解決不了,可以和SAE官方聯繫.
服務限制
connect_timeout5秒
send_timeout15秒
read_timeout20秒
抓取檔案大小8MB
禁用頭,這些頭用戶無法修改Content- Length、Vary、Via、X-Forwarded-For、FetchUrl、AccessKey、TimeStamp、 Signature、AllowTruncated、ConnectTimeout、SendTimeout、ReadTimeout
分鐘配額
運行在SAE上的套用(App)將會消耗平台資源,為保證各App不互相影響,我們引入了*分鐘配額*的概念,即:在每分鐘內每個套用的各個服務所消耗 的 資源的速度。比如,當平台中的某個套用的MySQLl服務一分鐘內累計請求數達到10萬,或者流出寬頻超過200M,我們將會立即禁掉該套用的MySQL 服務,禁用五分鐘後會自動恢復,避免影響到SAE平台的穩定性。服務因為超過“分鐘配額”而被禁用時,會在“服務狀態”看到該服務被禁用的原因是:OverMinuteQuota
服務請求數cpu時間流入頻寬流出頻寬
Fetchurl100,000NA200MB200MB
常見問題
SAE平台出口IP:
220.181.129.126
220.181.129.121
220.181.136.229
220.181.129.93
220.181.129.102
220.181.129.117
220.181.129.90
220.181.136.230
http接口方需要IP授權可以進行相應的設定。
PHP使用指南
抓取頁面
$f = new SaeFetchurl();
$content = $f->fetch('http://……');
發起POST請求
$f = new SaeFetchurl();
$f->setMethod('post');
$f->setPostData( array('name'=> 'easychen' , 'email' => 'easychen@gmail_com' , 'file' => '檔案的二進制內容') );
$ret = $f->fetch('http://……');
//抓取失敗時輸出錯誤碼和錯誤信息
if ($ret === false)
var_dump($f->errno(), $f->errmsg());
錯誤碼參考
errno: 0 成功
errno: 600 fetchurl 服務內部錯誤
errno: 601 accesskey 不存在
errno: 602 認證錯誤,可能是secretkey錯誤
errno: 603 超出fetchurl的使用配額
errno: 604 REST 協定錯誤,相關的header不存在或其它錯誤,建議使用SAE提供的fetch_url函式
errno: 605 請求的URI格式不合法
errno: 606 請求的URI,伺服器不可達法
errno: 607 請求的擴展服務尚未開啟
Java調用方式
如何啟用服務
使用FetchURL服務無需額外啟動服務操作,參見文檔API調用即可。
此外為了保障平台安全性,SAE對FetchURL做了以下限制:
http連線逾時<=5秒
send逾時<=15秒
read逾時<=20秒
http header禁用項:Content-Length、Host、Vary、Via、X-Forwarded-For、FetchUrl、AccessKey、TimeStamp、Signature、 AllowTruncated、ConnectTimeout、SendTimeout、ReadTimeout
另外如果抓取的url內包含中文,需要對中文進行轉碼。
本地環境使用
本地環境使用httpclient4.x模擬Fetchurl服務,所以在本地使用Fetchurl服務無需額外配置,僅需將相關jar包放入classpath中即可。
使用範例
Fetchurl服務的操作都封裝在SaeFetchurl類中,下面給出抓取網頁和傳送請求例子:
抓取網頁
SaeFetchurl fetchUrl = new SaeFetchurl();
String content = fetchUrl.fetch("http://……");
傳送請求
SaeFetchurl fetchUrl = new SaeFetchurl();
// 設定請求的方法(POST/GET/PUT... )
fetchUrl.setMethod("post");
//設定POST方法的數據
Map maps = new HashMap();
maps.put("name1","value1");
maps.put("name2","value2");
fetchUrl.setPostData(maps);
// 當請求頁面是轉向頁時,是否允許跳轉,SAE最大支持5次跳轉(默認允許跳轉)
fetchUrl.setAllowRedirect(true);
//添加cookie數據
fetchUrl.setCookie("key", "value");
/*
* 是否允許截斷,默認為不允許 如果設定為true,當傳送數據超過允許大小時,自動截取符合大小的部分;
* 如果設定為false,當傳送數據超過允許大小時,直接返回false
*/
fetchUrl.setAllowTrunc(true);
//設定讀取逾時時間,此時間必須小於SAE系統設定的時間,否則以SAE系統設定為準(默認為60秒)
fetchUrl.setReadTimeout(20);
//設定傳送逾時時間,此時間必須小於SAE系統設定的時間,否則以SAE系統設定為準(默認為20秒)
fetchUrl.setSendTimeout(10);
//設定HTTP認證用戶名密碼
fetchUrl.setHttpAuth("user", "passwd");
//抓取url並返迴響應體內容
String result = fetchUrl.fetch("http://……");
//返回HTTP狀態碼
int stat=fetchUrl.getHttpCode();
//返回網頁內容
String body=fetchUrl.body();
//返回數據的回響頭信息
fetchUrl.responseHeaders();
//返回錯誤碼
fetchUrl.getErrno();
//返回錯誤信息
fetchUrl.getErrmsg();
//將對象的數據重新初始化,用於多次重用一個SaeFetchurl對象
fetchUrl.clean();
錯誤輸出和錯誤碼
errno: 0 成功
errno: 600 fetchurl 服務內部錯誤
errno: 601 accesskey 不存在
errno: 602 認證錯誤,可能是secretkey錯誤
errno: 603 超出fetchurl的使用配額
errno: 604 REST 協定錯誤,相關的header不存在或其它錯誤
errno: 605 請求的URI格式不合法
errno: 606 請求的URI,伺服器不可達