php - 从实现 AJAX 分页的所有 asp.net 页面中抓取数据

标签 php asp.net curl web-scraping screen-scraping

我想删除一个包含地址、电子邮件等用户列表的网页。网页包含带分页的用户列表,即页面包含 10 个用户,当我单击第 2 页链接时,它将通过 AJAX 从第二页加载用户列表,并且更新所有分页链接的列表。

网站是用 asp 开发的,即扩展名为 .aspx 的页面,因为我对 asp.net 以及 asp 如何管理分页和 AJAX 一无所知

我正在使用简单的 html dom http://sourceforge.net/projects/simplehtmldom/抓取包含

对于有用户的页面 <=10我不必像用户单击分页链接时一样模拟 AJAX 请求

但是对于有分页的页面从其他页面获取数据,我正在模拟 post 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 如何管理分页和 AJAX 请求以及什么是 __EVENTARGUMENT , __VIEWSTATE__EVENTVALIDATION

最佳答案

一般来说,为了让 ASP.NET 网站认为您确实按下了按钮(更一般地说 - 执行回发),您需要执行以下操作:

  1. 获取页面上每个 INPUT 和 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 header 。

关于php - 从实现 AJAX 分页的所有 asp.net 页面中抓取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14768302/

相关文章:

javascript - 如何在 Symfony2 中更改警报消息中的 Flash 消息

php - 将 CSS 中的背景图像添加到高级自定义字段 (ACF)

在 IIS 中部署后 CSS 不工作

linux - 无需下载即可获取 Content-Disposition 文件名

php - 使用不准确的字符串作为 xpath 标识符

javascript - 在 gridview 中使用 <a href>

ASP.NET:如何使链接成为多行?

linux - 如何使用 curl 向 Google 发送请求

php - 如何将 cURL 转换为 PHP cURL