javascript - 将长文本从脚本浏览器 (phantomjs) 发布到 php 脚本不会超过 2kb/2400 个字符

标签 javascript php json phantomjs

我使用 phantomjs 进行一些数据抓取(基本上它是一个浏览器,您可以在其中编码并从命令行运行它)

我正在收集有关足球比赛(球队/国家/联赛,...)的信息,每个信息作为一个对象,将它们全部放入一个数组中,将数组编码为 jason 格式并将结果发布到 php 脚本

结果可能是一个非常长的文本,具体取决于每天的游戏数量,当这种情况发生时,我将无法获得 php 脚本的全文

在 php 脚本中,我将发布的数据存储在一个文本文件中,以查看发生了什么,每次最多大约 2.3kb2397~ 个字符

虽然我在终端上看到的原始发布文本约为 40kb40000 字符

所以一定有什么东西限制了这里的字符,这是我的 php.ini 信息,这已经足够了:

post_max_size -> 20M
max_input_vars -> 100000
memory_limit -> 256M

这里是我的代码的简化版本:

var res = page.evaluate(function(sport) {
        var matches = new Array();
        $('div#table-matches').find('.table-main').find('tr').each(function(index, element) {
            var obj = {
                teams :   $(this).find('td').text() ,
                link  :    $(this).find('td').find('a:last').attr('href') ,
            };
         matches.push( obj );
    });
    return matches ;
});

var postBody = 'sport='+sport+'&data='+JSON.stringify(res);

console.log(postBody);
page.open('http://xxxxx/result/save', 'POST', postBody, function(status) {
    phantom.exit();
});

这是我在 php 脚本中得到的内容:

[{"country":"Japan","league":"Emperors Cup","link":"/soccer/japan/emperors-cup/kobe-urawa-65k5LIMh/","match_date":"2015/12/26 04:00","teams":"Kobe - Urawa"},
{"country":"England","league":"Ryman League","link":"/soccer/england/ryman-league/wingate-finchley-metropolitan-police-rwuqgSz9/","match_date":"2015/12/26 12:00","teams":"Wingate 

json 代码已在中间被切断,因此它不是有效的 json

还有什么我应该做的吗?

最佳答案

通常,当问题中提供了您的代码所运行的 HTML 时,寻找答案会更简单(指向该网站的链接也很好)。

幸运的是,您在 json 文件的一部分中留下了一些线索,即从已抓取站点中指向其中一个页面的链接:/soccer/england/ryman-league/wingate-finchley-metropolitan-police-rwuqgSz9/

如果我们通过 Google 找到它并查看源代码,就会清楚地发现 php 脚本中的数据在团队“Wingate & Finchley - Metropolitan”的标题处被 chop ,其中包含一个 & 符号,用作分隔符用于通过 URI 请求发送的变量和值,并将将您的数据变量分解为其他几个变量。

因此,要修改脚本,您只需正确编码 data 字符串即可:

var postBody = 'sport='+sport+'&data='+encodeURIComponent(JSON.stringify(res));

<小时/>

查找此问题原因的其他方法是检查服务器端的 $_SERVER 和 $_POST 数组,只需将其转储到文件中并查看整个数据 确实存在,因为您已经很好地检查了 PHP 配置,它应该存在。

<小时/>

解决这个问题的方法,如果问题没有得到解决(例如,如果 PhantomJS 在 POST 请求方面有一个奇怪的错误),将是创建一个包含数据的临时文件并将该文件的路径发送到 php(假设解析是在同一台服务器上完成的):

var fs = require('fs');
var filename = '/tmp/scraped_' + (new Date()).getTime() + ".json";
fs.write(filename, JSON.stringify(res), 'w');
page.open('http://xxxxx/result/save', {"filename" : filename}, function(status) {
    phantom.exit();
});

关于javascript - 将长文本从脚本浏览器 (phantomjs) 发布到 php 脚本不会超过 2kb/2400 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34476353/

相关文章:

php - 如何识别远程主机的网络服务器名称

php - 尝试运行种子类时发出 "Grammar::parameterize() must be of the type array"

javascript - JQGrid 在列排序时丢失记录

javascript - "Open Link in new Tab"不应打开 iFrame 源页面

javascript - 表单提交时重新加载页面,getElementById 返回 null,表单不起作用

javascript - Mongo/mongoose $facet 过滤器,如果客户应用过滤器,则返回所有产品的品牌/标签作为响应

php - 解析 youtube 链接 PHP

javascript - "let"和 "var"有什么区别?

javascript - 如何重新创建 Fabric.js Canvas ?

mysql - 无法Struct将包含json对象列表的字符串类型的db字段扫描到Golang Struct中