Frage Scrapping von Daten von allen asp.net Seiten mit AJAX Paginierung implementiert


Ich möchte eine Webseite mit einer Liste von Benutzer mit Adressen, E-Mail etc. Website löschen Liste der Benutzer mit Seitenumbruch enthalten, dh Seite enthält 10 Benutzer, wenn ich auf Seite 2 Link klicken, wird es Benutzer Liste Formular laden 2. Seite über AJAX und Update-Liste so für alle Paginierungslinks aktiviert.

Die Website ist in asp, d. H. Seite mit der Erweiterung ASPX entwickelt, da ich nichts über asp.net weiß und wie Asp Seitenumbruch und AJAX verwaltet

Ich benutze einfach html dom http://sourceforge.net/projects/simplethtmlom/ zu Schrott enthalten

für Seiten mit Benutzern <=10  Ich muss keine AJAX-Anfrage simulieren, wie wenn der Benutzer auf den Paginierungslink klickt

aber für Seiten mit Paginierung, um Daten von anderen Seiten zu erhalten, simuliere ich Post-AJAX-Anfragen

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'];
}

Dies sollte Daten von verschiedenen Seiten wiedergeben, aber es druckt immer Daten der ersten Seite, kann jemand mich zeigen, wo ich bin und was fehlt Ich weiß nicht, wie ASP Paginationen und AJAX-Anfrage verwaltet und was ist __EVENTARGUMENT, __VIEWSTATE und __EVENTVALIDATION


15
2018-02-08 08:13


Ursprung


Antworten:


Im Allgemeinen, um die ASP.NET-Website zu fälschen, um zu glauben, dass Sie tatsächlich eine Taste gedrückt haben (in allgemeineren Bedingungen - ein Postback durchgeführt), müssen Sie Folgendes tun:

  1. Holen Sie sich den Wert jedes einzelnen INPUT- und SELECT-Elements auf der Seite. Es ist möglicherweise nicht in jedem Szenario erforderlich, aber Sie sollten immer mindestens die Werte aller ausgeblendeten Felder abrufen, in denen der Name mit "__" beginnt (z. B. __VIEWSTATE). Sie müssen nicht wirklich wissen, was in ihnen geschrieben ist - nur dass der Wert in ihnen unverändert an den Server zurückgeschickt werden muss.

  2. Erstellen Sie eine POST-Anfrage an den Server. Sie müssen den klassischen POST verwenden, um AJAX-Anfragen zu vermeiden. Mit einigen Browser-Plugins (in Firefox oder Chrome) kann es möglich sein, XMLHttpRequest zu deaktivieren, so dass Sie dann die Nicht-AJAX-Anfrage mit Tools wie Fiddler abfangen können.

  3. Fügen Sie jeden Wert von # 1 zu dieser Postanforderung hinzu. Es gibt nur zwei Werte, die Sie überschreiben müssen: __EVENTTARGET und __EVENTARGUMENT. Sie würden diese leer lassen, außer wenn der Link oder die Schaltfläche, die Sie zu imitieren versuchen, eine hat onclick Handler mögen <a href="javascript:__doPostBack('ctl00$login','')">. Wenn dies der Fall ist, analysieren Sie die Werte von diesem Link - der erste ist das Ereignisziel (normalerweise entspricht er der ID eines Elements auf der Seite), der zweite ist das Ereignisargument.

  4. Wenn Sie die Anfrage korrekt ausgeführt haben, sollten Sie die HTML-Seite zurückbekommen. Wenn Sie eine teilweise Antwort erhalten, überprüfen Sie, ob Sie den HTTP-Header, der nach asynchronen Ergebnissen fragt, nicht übergeben haben.


27
2018-02-19 17:44



Mein bester Rat ist, iMacros zu benutzen https://addons.mozilla.org/en-US/firefox/addon/imacros-for-firefox/

iMacros:

  1. Notieren Sie den Download der Seite. http://wiki.imacros.net/First_Steps
  2. Speichern Sie die Webseite im lokalen Verzeichnis. http://wiki.imacros.net/SAVEAS
  3. Scrap E-Mail, Adressen usw. mit PHP-Skript.

Egal ob Ajax - .aspx, .jsp oder .php.


3
2018-02-21 18:33



Ich würde empfehlen, sich in Ruby zu verzweigen und es zu versuchen Capybara Das ist eine vernünftige Art, Selen zu verwenden. Sie können eine Seite besuchen und dann das tatsächliche DOM überprüfen. Sie können auf alles klicken, auf Ereignisse warten usw. Es benutzt einen echten Browser.

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

2
2018-02-25 00:59



Ich habe einen Testcode, der auf Ihrer Basis als Grundlage funktioniert, und das einzige Problem, das ich gefunden habe, war diese Zeile.

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')

müsste der urlencode verschoben werden um so auszusehen

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'

0
2017-12-01 23:57