2010年4月3日 星期六

Curl 截取ASPX的網頁資訊

最近剛好想要撈一個ASPX網頁的資料,
想說用php+curl就可以輕易的透過post將資料截取回來,
不過,實際去寫code的時候就會發現,其實ASP並沒有這麼容易就可以下載回來。
因為,ASP在post資料時,會將一些訊息紀錄在__VIEWSTAT這個欄位中,
如果沒有取得這個欄位的資料,則用post請求的資料會變的不正確,
因此,若想要取得正確的資料,就必須先下載請求的頁面,並且剖析取出__VIEWSTAT的值,再將__VIEWSTAT的值填入參數之中,一起送出請求,
這樣才能正確的截取資料回來了。

參考來源:

http://www.phpbuilder.com/board/archive/index.php/t-10328567.html

http://my-web-design.blogspot.com/2008/11/curl.html

所以,我們舉個例子,以便說明程式的寫法:

Step1 取得__VIEWSTAT資料

首先跑一次Curl,將__VIEWSTAT的參數內容截取回來:

$link = "http://test.web.idv.tw/query.aspx";
$ch = curl_init($link);
if (!$ch)
{
die( "Cannot allocate a new PHP-CURL handle" );
}
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 13); //times out after 4s
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
$result = curl_exec ($ch);
$token = "__VIEWSTATE";
$result = strstr($result, $token);
$result = substr($result, strlen($token));
$endpos = strpos($result, \'" />\');
$result = substr($result, 9,$endpos-9);
//URLENCODE
$result= urlencode($result);


其中這段程式的第一行的$link是欲下載目標連結,第7~11行是curl的參數設定,第12行是第一次使用curl下載表單,第13~17行則是將__VIEWSTATE的參數截取回來。第19行則是將取得的資料轉換成url的型態,這樣之後可以直接將$result當做參數,再向同一個網頁要求資訊。

這裡比較要注意的是第17行可能會因為ASP欄位的不同,資料所在也不同,所以要自行修改截取的位置。

Step2 正式要求我們所要的資料

接著我們再次要求我們所需要的資料,假設我們現在要post的資料欄位是日期和IP位置,
那就必須將日期、IP和viewstat的資料結合在一起,然後一次送出,
範例如下:


/**
* For getting date from query
*/
$viewstat = "__VIEWSTAT=$result";
$dodate = "dodate=2014/03/22";
$ip = "ip=211.211.211.211";
$all_arguments= $viewstat.$dodate.$ip ;
//Request data
$link = "http://test.web.idv.tw/query.aspx";
$ch = curl_init($link);
if (!$ch)
{
die( "Cannot allocate a new PHP-CURL handle" );
}
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 13); //times out after 4s
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$all_arguments);
$data=curl_exec($ch);


其中第1~4行是在整理參數,第6行之後是重新在要一次資料,這次我們將取得的資料存放在$data中。
按照這樣的步驟,就可以正常取得ASPX的資料了


沒有留言:

Related Posts Plugin for WordPress, Blogger...