【问题标题】:How to get a webpage containing an external API in php如何在php中获取包含外部API的网页
【发布时间】:2020-10-12 22:43:01
【问题描述】:

我有一个 php 脚本,它加载 this 网页以从它的表格中提取一些数据。
以下方法无法获取其表格内容:

使用 file_get_contents:

$document -> file_get_contents("http://www.webpage.com/");
print_r($document);

使用 cURL:

$document = curl_init('http://www.webpage.com/');
curl_setopt($document, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($document);
print_r($html);

使用 loadHTMLFile:

$document->loadHTMLFile('http://www.webpage.com/');
print_r($document);

我不是 php 专家,除了第一种方法外,其他方法都是从 StackOverflow 的答案中复制的。
我做错了什么?
以及它们是如何阻止某些内容加载的?

【问题讨论】:

    标签: php html


    【解决方案1】:

    所以也许考虑使用 curl 并模仿网站正在使用的相同 ajax 请求?当我搜索它时,这就是我发现的: Mimicking an ajax call with Curl PHP

    【讨论】:

      【解决方案2】:

      不是您可能想听到的答案,但您描述的任何方法都不会像普通浏览器客户端那样评估 JavaScript 和其他浏览器资源。相反,这些方法中的每一个都只检索您指定的文件的内容。快速浏览一下您所定位的网站,可以清楚地看到这个有问题的表格是作为 AJAX 调用的结果填充的,而您尝试过的任何方法都无法评估。

      您需要依赖具有这种模拟能力的库或脚本;即laravel/duskSelenium webdriver 的 PHP 绑定,或类似的东西。

      【讨论】:

      • 我需要用 Cron 执行我的 php 脚本。是否可以在服务器上安装这些库/脚本?我阅读了文档,其中提到了 WebDrivers 和浏览器。我一个字都听不懂。 :)
      • Mehdi,这听起来可能很直率 - 如果您不了解这些库的文档或它们的确切用途,您应该暂停一下以更好地了解这些库和您的 PHP基本面。您采用的理念应该是在任何情况下都不要运行您不知道它的作用的代码 - 据您所知,我可以将您链接到在您的服务器上安装安全后门的恶意库!
      • 感谢先生的建议。我是一名电子工程师,我被分配建立一个广告牌来显示实时货币和黄金价格。完成这个项目所需要做的就是从该网站提取这些数据。我知道在不完全理解的情况下使用这些工具和库的风险。这就是我作为专业人士寻求您的建议/帮助的原因。是否有任何教程/手册可以指导我安全地完成这项任务?实现 WebDrivers 似乎是一项专业任务,没有文档可以帮助像我这样的初学者。
      • 您的要求是专门从网站上抓取数据吗?有没有你可以使用的 API?这可能需要更少的跑腿来启动和运行。
      • 不幸的是,这个网站拥有最可靠的数据,而我在数据源方面没有太多选择。
      【解决方案3】:

      这是我使用 php curl 从网页中抓取数据所做的:

          // Defining the basic cURL function
          function curl($url) {
              $ch = curl_init();  // Initialising cURL
              curl_setopt($ch, CURLOPT_URL, $url);    // Setting cURL's URL option with the $url variable passed into the function
              curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); // Setting cURL's option to return the webpage data
              $data = curl_exec($ch); // Executing the cURL request and assigning the returned data to the $data variable
              curl_close($ch);    // Closing cURL
              return $data;   // Returning the data from the function
          }
      
      
      // Defining the basic scraping function
          function scrape_between($data, $start, $end){
              $data = stristr($data, $start); // Stripping all data from before $start
              $data = substr($data, strlen($start));  // Stripping $start
              $stop = stripos($data, $end);   // Getting the position of the $end of the data to scrape
              $data = substr($data, 0, $stop);    // Stripping all data from after and including the $end of the data to scrape
              return $data;   // Returning the scraped data from the function
          }
      
      
      $target_url = "https://www.somesite.com";
                                      
      
      $scraped_website = curl($target_url);  
      
      $data_set_1 = scrape_between($scraped_website, "%before%", "%after%");
      $data_set_2 = scrape_between($scraped_website, "%before%", "%after%");
      

      %before% 和 %after% 是始终显示在网页上您希望抓取的数据之前和之后的数据。可以是 div 标签或其他一些您希望抓取的数据所独有的 html 标签。

      【讨论】:

      • 不确定“加载表格”是什么意思。这段代码所做的是将页面的 HTML 放入一个变量中,然后您可以提取位于两个已定义数据集之间的数据。您是否尝试在您的网站上显示来自其他网站的表格?
      • 我只想获取原始数据并从中提取一些信息。该站点使用 AJAX 加载这些信息,而您的方法无法获取它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      相关资源
      最近更新 更多