Grattage des données de toutes les pages asp.net avec pagination AJAX implémentée
Je veux scrapper une page web contenant une liste d'utilisateurs avec des adresses, e-mail etc. la page web contient la liste des utilisateurs avec la pagination c'est à dire la page contient 10 utilisateurs lorsque je clique sur la page 2 du lien il va charger la liste des utilisateurs formulaire 2ème page via AJAX et mise à jour de la liste ainsi de suite pour tous les liens de pagination.
Site est développé en asp c'est à dire la page avec l'extension .aspx depuis je ne sais rien à propos de asp.net et comment l'asp gère la pagination AJAX et
Je suis à l'aide du simple html dom http://sourceforge.net/projects/simplehtmldom/ à la ferraille de contenir
pour les pages que les utilisateurs <=10
je n'ai pas de simuler une requête AJAX même que lorsque l'utilisateur clique sur le lien de pagination
mais pour la page d'avoir la pagination pour obtenir des données à partir d'autres pages que je suis en simulant post requête 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'];
}
ce devrait résonner des données à partir de différentes pages, mais Il permet d'imprimer les données de la première page, quelqu'un peut-il m'indiquer où je suis worng et ce qui est manquant
Je ne sais pas comment l'asp gère les paginations et de la requête AJAX et qu'est-ce que __EVENTARGUMENT
, __VIEWSTATE
et __EVENTVALIDATION
source d'informationauteur Subodh Ghulaxe
Vous devez vous connecter pour publier un commentaire.
En général, afin de simuler la ASP.NET site web de penser que vous avez réellement appuyé sur un bouton (en termes plus généraux, - procédé à une publication), vous devez effectuer les opérations suivantes:
Obtenir la valeur de chaque ENTRÉE et SÉLECTIONNER l'élément sur la page. Il pourrait ne pas être nécessaire dans tous les scénarios, mais vous devriez toujours obtenir au moins les valeurs de tous les champs cachés où le nom commence par "__" (comme __VIEWSTATE). Vous n'avez pas vraiment besoin de savoir ce qui est écrit dans - il suffit que la valeur doit être envoyé vers le serveur inchangé.
Créer une requête POST vers le serveur. Vous avez besoin d'utiliser la voie postale classique, en évitant toutes les requêtes AJAX. À l'aide de certains plug-ins de navigateur (Firefox ou Chrome), il pourrait être possible de désactiver XMLHttpRequest ainsi, vous pouvez intercepter les non-requête AJAX avec des outils comme Fiddler.
Ajouter toutes les valeurs de n ° 1 de la requête post. Il y a seulement deux valeurs que vous avez besoin de remplacer: __EVENTTARGET et __ _ _ EVENTARGUMENT. Vous laisserait les vides, sauf si le lien ou le bouton que vous essayez d'imiter, a une
onclick
gestionnaire<a href="javascript:__doPostBack('ctl00$login','')">
. Si elle l'est, analyser les valeurs à partir de ce lien - le premier est la cible de l'événement (elle va correspondre à l'IDENTIFIANT d'un élément sur la page), la seconde est l'argument d'événement.Si vous avez exécuté la demande correctement, vous devriez obtenir le retour à la page HTML. Si vous obtenez une réponse partielle, vérifiez si vous n'avez pas passer l'en-tête HTTP qui demande asynchrone résultat.
Mon meilleur conseil est d'utiliser iMacros https://addons.mozilla.org/en-US/firefox/addon/imacros-for-firefox/
iMacros :
Peu importe si c'est ajax .aspx, .jsp ou .php.
Je recommanderais ramification en Ruby et en essayant Capybara qui est une façon saine de l'utilisation de Sélénium. Il vous permet de faire une visite d'une page, puis examiner les DOM. Vous pouvez cliquer sur tout, d'attendre les événements, etc. Il utilise un vrai navigateur.
J'ai eu de test de code de travail en utilisant le vôtre comme base et le seul problème que j'ai trouvé a été de cette ligne.
aurait besoin de la fonction urlencode déplacé à regarder comme si