如何使用PHP / Curl模拟javascript生成的下载请求

时间:2015-12-28 06:20:12

标签: javascript php curl

我正在尝试使用PHP / Curl从公共网站下载一个开放数据项目的文件。如何使用PHP / Curl模拟下载请求以获取文件?

请你帮我解决一下这个问题,或者至少我应该如何解释这个问题?

该网站使用javascripts生成下载操作。下载请求是通过后请求完成的(因此没有URL可见)。

该网站是:http://cri.nbb.be/bc9/web/catalog?lang=N&companyNr=0403233750 我尝试下载的文件是与该实体相关的最新XBRL文档。

下载请求的标题如下:

Host: cri.nbb.be
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://cri.nbb.be/bc9/web/catalog?execution=e1s1
Cookie: be.nbb.selected.language=nl; JSESSIONID=00003DzVLI5-4k_otlBnJ3ylzKQ:-1; TS01f1bcac=011cb8a973def2718973d95f3988ed8392a49007ea289ef41640f86d275cfbbcc3df12bec9ffca6ced4717c1f1904a1785807d461dd198bf5951a9c35c905e55eeb738ad098adfe9ea3eef44ea3732108f528c6c5d; BIGipServerprd-bc9=270313664.46162.0000
Connection: keep-alive

我可以使用以下代码获取生成下载请求的源文件(带有javascript的htlm):

$filename = "0403233750.html";
$url = "http://cri.nbb.be/bc9/web/catalog?lang=N&companyNr=0403233750";
$ch = curl_init ($url);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt ($ch, CURLOPT_COOKIEFILE, "cookie.txt");
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)');
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    $output = curl_exec ($ch);
    if (preg_match('/expired/', $output)){
    return "stop";
    }
    if (preg_match('/problem/', $output)){
    return "stop";
    }
    if (!preg_match('/xml/', $output)){
    return "stop";
    }
file_put_contents($filename, $output);
curl_close ($ch); 

但是一旦我有了javascript,我就不知道在PHP / Curl中生成下载请求需要用什么。

1 个答案:

答案 0 :(得分:1)

在模仿请求时,您可以使用选项CURLOPT_HTTPHEADER直接设置这些请求标头。虽然大多数情况下所有请求标头都不重要。

$ch = curl_init($url);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch,CURLOPT_HEADER, 0);
curl_setopt($ch,CURLOPT_COOKIEFILE, "/var/tmp/cookie.txt");  // use full path always
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch,CURLOPT_HTTPHEADER, array(
    'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language: en-US,en;q=0.5',
    'Accept-Encoding: gzip, deflate',
    'Referer: http://cri.nbb.be/bc9/web/catalog?execution=e1s1',
    'Cookie: be.nbb.selected.language=nl; JSESSIONID=...whatever u have...'

));
$output = curl_exec($ch);
curl_close ($ch);

尽管存在针对不同请求标头的特定卷曲选项。例如,用户代理字符串可以与CURLOPT_USERAGENT一起使用,引用标头可以与CURLOPT_REFERER一起使用,依此类推。通过此链接可以看到更多选项用法:http://php.net/manual/en/function.curl-setopt.php