我使用 phantomjs 进行一些数据抓取(基本上它是一个浏览器,您可以在其中编码并从命令行运行它)
我正在收集有关足球比赛(球队/国家/联赛,...)的信息,每个信息作为一个对象,将它们全部放入一个数组中,将数组编码为 jason 格式并将结果发布到 php 脚本
结果可能是一个非常长的文本,具体取决于每天的游戏数量,当这种情况发生时,我将无法获得 php 脚本的全文
在 php 脚本中,我将发布的数据存储在一个文本文件中,以查看发生了什么,每次最多大约 2.3kb
和 2397~
个字符
虽然我在终端上看到的原始发布文本约为 40kb
和 40000
字符
所以一定有什么东西限制了这里的字符,这是我的 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/