0

我正在尝试从以下网站获取信息:http: //www.borsabcn.es/esp/aspx/Empresas/Empresas.aspx

如您所见,该网站列出了在巴塞罗那证券交易所上市的公司。但它仅按字母顺序列出第一页。我正在使用 PHP 来自动从所有页面获取信息。例如,如果您单击顶部显示 的链接ERC - HUL,那么您将转到包含更多以字母开头的公司名称的页面:ERC。

我对 APSX 没有太多经验,但我在调查后可以看到,当您单击该链接时,会触发以下 JS 函数:

var GoPag = function (inicio) {
    document.forms.aspnetForm['ctl00_Contenido_GoPag'].value = inicio;
    document.forms.aspnetForm.submit();
}

这基本上只是提交带有隐藏输入字段(id="ctl00_Contenido_GoPag" name="ctl00$Contenido$GoPag")的表单,其值包含我们要显示的页码。默认值为 0,值为ERC - HUL3。

我正在尝试获取与第 3 页对应的页面,我有以下 PHP 代码,这是我在研究了一下后创建的:

$postdata = http_build_query(
    array(
        'ctl00$Contenido$GoPag' => '3'
    )
);

$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/xhtml+xm',
        'content' => $postdata
    )
);

$context  = stream_context_create($opts);

$result = file_get_contents('http://www.borsabcn.es/esp/aspx/Empresas/Empresas.aspx', false, $context);

echo $result;

但是,这总是返回默认页面 (0) 的结果,该页面列出了以字母 A 开头的公司。似乎发布的数据没有被正确解释。

我在正确的轨道上吗?有谁知道我可以做些什么来获取我正在寻找的数据?

谢谢!

4

1 回答 1

0

我最终找到了一种在 PHP 中使用 CURL 的工作方法。我从这个答案改编了代码:Php Curl Posting to .aspx

以下是将数据发布到 .aspx 页面并接收正确响应的一些工作代码:

$p = 1; //page number to get

$postdata = http_build_query(
    array(
        '__EVENTTARGET' => '',
        '__EVENTARGUMENT' => '',
        '__VIEWSTATE' => 'your_event_state_value',
        '__EVENTVALIDATION' => 'your_event_validation_value',
        'ctl00$Contenido$GoPag' => $p
    )
);

$url = 'http://www.borsabcn.es/esp/aspx/Empresas/Empresas.aspx';

// Initialise cURL
$ch = curl_init($url);

// Set options (post request, return body from exec)
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

// Do the request
$result = curl_exec($ch);

//show/check the result
echo $result;

我在上面的示例中删除了__VIEWSTATE__EVENTVALIDATION变量的值,但是您可以通过在浏览器中调查该页面的 HTML 来找到这些值。

于 2013-11-04T13:11:35.927 回答