2013-02-08 37 views
15

我想要使用地址,電子郵件等方式來截取包含用戶列表的網頁網頁包含用戶分頁的頁面,即當頁面點擊第2頁時頁面包含10個用戶鏈接它將通過AJAX加載用戶列表第二頁,併爲所有分頁鏈接更新列表等。使用AJAX分頁方式從所有asp.net頁面中颳去數據

網站是與擴展ASP的.aspx頁面,即開發,因爲我不知道asp.net什麼,ASP如何管理分頁和AJAX

我使用簡單的HTML DOM http://sourceforge.net/projects/simplehtmldom/報廢包含

具有用戶<=10我沒有模擬AJAX請求相同,當用戶點擊鏈接分頁頁面作爲

而且具有分頁到從其他網頁我模擬後AJAX請求

數據頁
require 'simple_html_dom.php'; 

$html = file_get_html('www.example.com/user_list.aspx'); 

$viewstate = $html->find("#__VIEWSTATE"); 
$viewstate = $viewstate[0]->attr['value']; 

$eventvalidation  = $html->find("#__EVENTVALIDATION"); 
$eventvalidation  = $eventvalidation[0]->attr['value']; 
$number_of_pageinations = 3; 

$pageNumberCodes = array(
    'ctl00$cphMainContent$rdpMembers$ctl01$ctl01', 
    'ctl00$cphMainContent$rdpMembers$ctl01$ctl02', 
    'ctl00$cphMainContent$rdpMembers$ctl01$ctl03' 
); // this code is added for each page in POST as __EVENTTARGET 

for ($i = 0; $i < $number_of_pageinations; $i++) { 
    $options = array(
     CURLOPT_RETURNTRANSFER => true, // return web page 
     CURLOPT_HEADER => false, // don't return headers 
     CURLOPT_ENCODING => "", // handle all encodings 
     CURLOPT_USERAGENT => "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.7) Gecko/20070914 Firefox/2.0.0.7'", // who am i 
     CURLOPT_AUTOREFERER => true, // set referer on redirect 
     CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect 
     CURLOPT_TIMEOUT => 1120, // timeout on response 
     CURLOPT_MAXREDIRS => 10, // stop after 10 redirects 
     CURLOPT_POST => true, 
     CURLOPT_VERBOSE => true, 
     CURLOPT_POSTFIELDS => urlencode('ctl00%24scriptManager=ctl00%24cphMainContent%24ctl00%24cphMainContent%24rdpMembersPanel%7C' . $pageNumberCodes[0] . '&__EVENTTARGET=' . $pageNumberCodes[0] . '&__EVENTARGUMENT=' . '&__VIEWSTATE=' . $viewstate . '&__EVENTVALIDATION=' . $eventvalidation . "&google=" . '&ctl00%24cphMainContent%24txtZip=' . '&ctl00%24cphMainContent%24cboRadius=Exact' . '&ctl00%24cphMainContent%24txtMemberName=' . '&ctl00%24cphMainContent%24txtCity=Honolulu' . '&ctl00%24cphMainContent%24cboState=HI' . '&ctl00%24cphMainContent%24txtAddress=' . '&ctl00_cphMainContent_rdpMembers_ClientState=' . '&ctl00%24cphMainContent%24ddList=-Select%20field%20to%20sort-' . '&ctl00_cphMainContent_ddList_ClientState=' . '&ctl00_cphMainContent_rdlMembers_ClientState=' . '&ctl00_cphMainContent_ddList_ClientState=' . '&ctl00_cphMainContent_rdlMembers_ClientState=' . '&ctl00_cphMainContent_rdpMembers1_ClientState=' . '&__ASYNCPOST=true' . 'RadAJAXControlID=ctl00_cphMainContent_RadAjaxManager1') 
    ); 
    $ch  = curl_init($url); 
    curl_setopt_array($ch, $options); 
    $return = curl_exec($ch); 
    curl_close($ch); 
    echo $return; 

    $newHtml = str_get_html($return); 

    $viewstate = $newHtml->find("#__VIEWSTATE"); 
    $viewstate = $viewstate[0]->attr['value']; 

    $eventvalidation = $newHtml->find("#__EVENTVALIDATION"); 
    $eventvalidation = $eventvalidation[0]->attr['value']; 
} 

這應該呼應,從不同的頁面數據,但它始終打印第一頁的數據,任何人可以點我在哪裏,我撥錯的,什麼是缺少 我不知道ASP如何管理paginations和AJAX請求,什麼是__EVENTARGUMENT__VIEWSTATE__EVENTVALIDATION

+2

發佈的URL將是有益的。您可能有幸使用[此圖書館](http://scraperblog.blogspot.com/2012/11/introducing-pgbrowser.html) – pguardiario

+0

來檢查您可以使用的發佈請求標題和內容http://www.fiddler2.com/fiddler2/ –

+0

我認爲你需要添加網址.... – Baba

回答

27

在一般情況下,爲了僞造ASP.NET網站認爲你實際上按下一個按鈕(在更一般的 - 進行回傳),你需要做到以下幾點:

  1. 獲取每一個IN的值頁面上的PUT和SELECT元素。這可能不是每個場景都需要的,但是您應該始終至少獲取名稱以「__」開頭的所有隱藏字段的值(例如__VIEWSTATE)。您並不需要知道寫入的內容 - 只需將其中的值保持不變地發送回服務器即可。

  2. 創建POST請求到服務器。您需要使用經典的POST,避免任何AJAX請求。使用一些瀏覽器插件(在Firefox或Chrome中),可能會禁用XMLHttpRequest,以便您可以使用Fiddler等工具截獲非AJAX請求。

  3. 將#1中的每個值都添加到該發佈請求中。只有兩個值需要覆蓋:__EVENTTARGET和__EVENTARGUMENT。除非您嘗試模仿的鏈接或按鈕具有onclick處理程序,例如<a href="javascript:__doPostBack('ctl00$login','')">,否則您將保留空白。如果是的話,解析這個鏈接的值 - 第一個是事件目標(它通常會匹配頁面上某個元素的ID),第二個是事件參數。

  4. 如果您正確執行了請求,則應該返回HTML頁面。如果您收到部分響應,請檢查您是否未通過要求提供異步結果的HTTP標頭。

2

我會推薦分支到Ruby並嘗試Capybara這是一個使用硒的理智方式。它可以讓你訪問一個頁面,然後檢查實際的DOM。您可以點擊所有內容,等待事件等。它使用真正的瀏覽器。

visit "http://www.google.com" 
page.find("button[name=btnK]") 
0

我得到了一些測試代碼工作使用你的基礎,我發現的唯一問題是這條線。

CURLOPT_POSTFIELDS => urlencode('ctl00%24scriptManager=ctl00%24cphMainContent%24ctl00%24cphMainContent%24rdpMembersPanel%7C' . $pageNumberCodes[0] . '&__EVENTTARGET=' . $pageNumberCodes[0] . '&__EVENTARGUMENT=' . '&__VIEWSTATE=' . $viewstate . '&__EVENTVALIDATION=' . $eventvalidation . "&google=" . '&ctl00%24cphMainContent%24txtZip=' . '&ctl00%24cphMainContent%24cboRadius=Exact' . '&ctl00%24cphMainContent%24txtMemberName=' . '&ctl00%24cphMainContent%24txtCity=Honolulu' . '&ctl00%24cphMainContent%24cboState=HI' . '&ctl00%24cphMainContent%24txtAddress=' . '&ctl00_cphMainContent_rdpMembers_ClientState=' . '&ctl00%24cphMainContent%24ddList=-Select%20field%20to%20sort-' . '&ctl00_cphMainContent_ddList_ClientState=' . '&ctl00_cphMainContent_rdlMembers_ClientState=' . '&ctl00_cphMainContent_ddList_ClientState=' . '&ctl00_cphMainContent_rdlMembers_ClientState=' . '&ctl00_cphMainContent_rdpMembers1_ClientState=' . '&__ASYNCPOST=true' . 'RadAJAXControlID=ctl00_cphMainContent_RadAjaxManager1') 

將需要進行urlencode窺測像這樣

CURLOPT_POSTFIELDS => 'ctl00%24scriptManager=ctl00%24cphMainContent%24ctl00%24cphMainContent%24rdpMembersPanel%7C' . $pageNumberCodes[0] . '&__EVENTTARGET=' . $pageNumberCodes[0] . '&__EVENTARGUMENT=' . '&__VIEWSTATE=' . rawurlencode($viewstate) . '&__EVENTVALIDATION=' . rawurlencode($eventvalidation) . "&google=" . '&ctl00%24cphMainContent%24txtZip=' . '&ctl00%24cphMainContent%24cboRadius=Exact' . '&ctl00%24cphMainContent%24txtMemberName=' . '&ctl00%24cphMainContent%24txtCity=Honolulu' . '&ctl00%24cphMainContent%24cboState=HI' . '&ctl00%24cphMainContent%24txtAddress=' . '&ctl00_cphMainContent_rdpMembers_ClientState=' . '&ctl00%24cphMainContent%24ddList=-Select%20field%20to%20sort-' . '&ctl00_cphMainContent_ddList_ClientState=' . '&ctl00_cphMainContent_rdlMembers_ClientState=' . '&ctl00_cphMainContent_ddList_ClientState=' . '&ctl00_cphMainContent_rdlMembers_ClientState=' . '&ctl00_cphMainContent_rdpMembers1_ClientState=' . '&__ASYNCPOST=true' . 'RadAJAXControlID=ctl00_cphMainContent_RadAjaxManager1'