【问题标题】:crawling page does only work for 3%抓取页面仅适用于 3%
【发布时间】:2016-11-02 12:19:10
【问题描述】:

我正在尝试抓取网站的完整部分,但问题是我需要的数据从一开始就没有。有没有办法用 PHP 从网站上获取数据?

这是链接:https://www.iamsterdam.com/nl/uit-in-amsterdam/uit/agenda 这是我需要的部分:

在我的帖子被设置为重复后,我尝试了这个 https://stackoverflow.com/a/28506533/7007968 但也不起作用,所以我需要其他解决方案,这就是我尝试过的:

get-website.php

$phantom_script= 'get-website.js'; 


$response =  exec ('phantomjs ' . $phantom_script);

echo  $response;

get-website.js

var webPage = require('webpage');
var page = webPage.create();

page.open('https://www.iamsterdam.com/nl/uit-in-amsterdam/uit', function(status) {
  console.log(page.content);
  phantom.exit();
});

这就是我返回的全部内容(大约 3% 的页面):

</div><div id="ads"></div><script src="https://analytics.twitter.com/i/adsct?p_id=Twitter&amp;p_user_id=0&amp;txn_id=nvk6a&amp;events=%5B%5B%22pageview%22%2Cnull%5D%5D&amp;tw_sale_amount=0&amp;tw_order_quantity=0&amp;tw_iframe_status=0&amp;tpx_cb=twttr.conversion.loadPixels" type="text/javascript"></script></body></html>

所以我觉得我越来越接近这是我经过大量搜索后的结果:

var webPage = require('webpage');
var page = webPage.create();
var settings = {
  operation: "POST",
  encoding: "utf8",
  headers: {
    "Content-Type": "application/json"
  },
  data: JSON.stringify({
    DateFilter: 04112016,
    LastMinuteTickets:  0,
    PageId: "3418a37d-b907-4c80-9d67-9fec68d96568",
    Skip: 0,
    Take:   12,
    ViewMode: 1
  })
};

page.open('https://www.iamsterdam.com/api/AgendaApi/', settings, function(status) {
  console.log(page.content);
  phantom.exit();
});

但我回来的东西看起来不太好:

Message":"An error has occurred.","ExceptionMessage":"Page could not be found","ExceptionType":"System.ApplicationException","StackTrace":" at Axendo.SC.AM.Iamsterdam.Controllers.Api.AgendaApiController.GetResultsInternal(RequestModel requestModel)\r\n at lambda_method(Closure , Object , Object[] )\r\n

等等

希望有人能帮到我,

【问题讨论】:

  • 查看我关于页面缺失 97% 的回答。至于为什么 API 不起作用,可能真的是您真的在寻找丢失的页面。如果您想进一步讨论它,您应该在另一个问题中询问 API 问题。

标签: javascript php api phantomjs web-crawler


【解决方案1】:

解决您大约 3% 的主要问题。 您错误地使用了exec。当这样使用时

$response =  exec ('phantomjs ' . $phantom_script);

$response 将包含 在执行给定命令期间在终端中打印的内容的最后一行。因为你做了console.log(page.contents);,所以 HTML 文档的最后一行被放入了 $response 变量中。

exec 的正确用法是

exec ('phantomjs ' . $phantom_script, $response);

这样,结果将作为数组放入 $response 变量中,每一行都是数组的一个元素。然后,如果你只想获取html,你可以这样做

$html = implode("\n", $response);

但更简单正确的方法是使用任务的具体功能:

passthru ('phantomjs ' . $phantom_script);

passthru 执行一个函数并将接收到的数据未经修改直接返回到输出。

因此,如果您想将其包含在变量中,请执行以下操作:

ob_start();
passthru ('phantomjs ' . $phantom_script);
$html = ob_get_clean();

【讨论】:

  • 我会提出另一个关于 api 的问题,因为 api 会快很多,但现在你的回答对我有很大帮助,谢谢
  • 如果你有时间的话,这里是链接stackoverflow.com/q/40397214/7007968
猜你喜欢
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
相关资源
最近更新 更多