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

标签 javascript php curl

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

您能帮我解决这个问题吗?至少可以帮我解决这个问题吗?

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

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

下载请求的 header 如下:

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的html):

$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 中生成下载请求。

最佳答案

在模仿请求时,您可以使用选项CURLOPT_HTTPHEADER直接设置这些请求 header 。尽管大多数情况下,所有请求 header 并不重要。

$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);

尽管对于不同的请求 header 存在特定的curl选项。例如,用户代理字符串可以与 CURLOPT_USERAGENT 一起使用,引用 header 可以与 CURLOPT_REFERER 一起使用,等等。更多选项用法可以从这个链接看到:http://php.net/manual/en/function.curl-setopt.php

关于javascript - 如何使用 PHP/Curl 模拟 javascript 生成的下载请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34488599/

相关文章:

PHP - 在字符串中间添加字符(从末尾开始)

ruby - 无法安装 Curb - native 扩展有问题。

PHP 通过 cURL 发送本地文件

php - 如何在 Windows 上安装 Laravel 4 软件包

javascript - Jquery inputmask 动态屏蔽特定电子邮件域

javascript - 需要正则表达式帮助使用 Javascript 解析 mediawiki 模板

javascript - 如何根据其他JSON数据选择JSON中的数据? Javascript

php - 网址错误 0 : The cURL request was retried 3 times and did not succeed

javascript - 如何在angularjs中添加间隔时间?

javascript - 在字段中输入 3 个字符后如何执行 API 调用?