【问题标题】:How to emulate javascript generated download request with PHP/Curl如何使用 PHP/Curl 模拟 javascript 生成的下载请求
【发布时间】:2015-12-28 06:20:11
【问题描述】:

我正在尝试使用 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 中生成下载请求。

【问题讨论】:

  • 你想做什么?使用 JavaScript 下载文件?还是模拟使用 PHP.cURL 下载文件的 JavaScript 代码?
  • 感谢您的快速回答。我想使用 PHP/curl 模拟 JavaScript

标签: javascript php curl


【解决方案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);

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

【讨论】:

  • 谢谢。我仍然需要了解标头是如何由目标网站上的 JavaScript 生成的。我尝试使用 firebug 逐步完成请求,但不明白发生了什么。有没有更合适/更简单的方法来理解浏览器为了模拟它做了什么?
  • 到目前为止,我的理解是,Javascript 在浏览器上运行,并且在大多数情况下,浏览器会设置默认值(如果 javascript 没有设置它)。即AcceptAccept-LanguageAccept-Encoding 等标题。 User-Agent 标头针对您的浏览器是固定的,并且引用者是根据您正在运行 javascript 的当前页面设置的。对于 cookie,它使用服务器返回的任何内容。我相信您需要了解 http 请求的基础知识,您可以在 tutorialspoint.com/http/http_requests.htm 找到它
  • 谢谢。因此,如果我理解,下载请求可能是由 POST 请求触发的。因此标题是不够的,我还需要 POST 内容。
猜你喜欢
  • 2015-07-27
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-22
  • 2016-01-24
  • 2011-05-14
  • 2017-10-05
相关资源
最近更新 更多