我正在尝试使用 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/