PHP Web抓取Javascript生成的内容

PHP Web抓取Javascript生成的内容,php,html,web-scraping,Php,Html,Web Scraping,在我的项目中,我被困在一个清理任务中 我想从$html中的链接中获取数据,tr和td的所有表内容,这里我试图获取链接,但它只显示javascript:self.close() 通常,此类页面加载一组Javascript(jQuery等),然后构建接口并从数据源检索要显示的数据 因此,您需要做的是在Firefox或类似的浏览器中打开该页面,使用Firebug等工具查看实际执行的请求。如果幸运的话,可以直接在XHR请求列表中找到它。在这种情况下: http://www.govliquidation.

在我的项目中,我被困在一个清理任务中

我想从$html中的链接中获取数据,tr和td的所有表内容,这里我试图获取链接,但它只显示javascript:self.close()


通常,此类页面加载一组Javascript(jQuery等),然后构建接口并从数据源检索要显示的数据

因此,您需要做的是在Firefox或类似的浏览器中打开该页面,使用Firebug等工具查看实际执行的请求。如果幸运的话,可以直接在XHR请求列表中找到它。在这种情况下:

http://www.govliquidation.com/json/buyer_ux/salescalendar.js
请注意,此操作过程可能会违反某些许可证或使用条款。在继续之前,请与网站管理员/数据源/版权所有者明确这一点:检测并禁止此类刮取非常容易,识别您的身份可能只是稍微少一点

无论如何,如果您在PHP中发出相同的调用,您可以使用非常简单的代码直接刮取数据(前提是没有会话/身份验证问题,这里似乎就是这样):

<?php

    $url = "http://www.govliquidation.com/json/buyer_ux/salescalendar.js";

    $json = file_get_contents($url);

    $data = json_decode($json);

?>

您检索
$data->result->events
,对其转换为数组形式的项和Bob的叔叔使用
fputcsv()

通常,此类页面加载一组Javascript(jQuery等),然后构建接口并从数据源检索要显示的数据

因此,您需要做的是在Firefox或类似的浏览器中打开该页面,使用Firebug等工具查看实际执行的请求。如果幸运的话,可以直接在XHR请求列表中找到它。在这种情况下:

http://www.govliquidation.com/json/buyer_ux/salescalendar.js
请注意,此操作过程可能会违反某些许可证或使用条款。在继续之前,请与网站管理员/数据源/版权所有者明确这一点:检测并禁止此类刮取非常容易,识别您的身份可能只是稍微少一点

无论如何,如果您在PHP中发出相同的调用,您可以使用非常简单的代码直接刮取数据(前提是没有会话/身份验证问题,这里似乎就是这样):

<?php

    $url = "http://www.govliquidation.com/json/buyer_ux/salescalendar.js";

    $json = file_get_contents($url);

    $data = json_decode($json);

?>

您检索
$data->result->events
,对其转换为数组形式的项使用
fputcsv()
,以及Bob的叔叔。

对于第二个站点,您有一个包含多个TR元素的表,并且希望捕获每个TR的前两个TD子项

通过检查源代码,您可以看到如下内容:

<tr>
      <td>&nbsp;Allendale</td>
      <td>&nbsp;Eastern Time
</td>
    </tr>
    <tr>
      <td>&nbsp;Alpine</td>
      <td>&nbsp;Eastern Time
</td>
有点像

           $csv[] = strip(
                html_entity_decode (
                  $td->innertext,
                  ENT_COMPAT | ENT_HTML401,
                  'UTF-8'
                )
           );

查看PHP手册页,了解关于字符集编码和实体处理的
html\u entity\u decode()。上面的方法应该有效——一个“应该”加50美分就能给你一杯咖啡:-)

在第二个站点中,你有一个包含多个TR元素的表,你想要捕捉每个TR的前两个TD子元素

通过检查源代码,您可以看到如下内容:

<tr>
      <td>&nbsp;Allendale</td>
      <td>&nbsp;Eastern Time
</td>
    </tr>
    <tr>
      <td>&nbsp;Alpine</td>
      <td>&nbsp;Eastern Time
</td>
有点像

           $csv[] = strip(
                html_entity_decode (
                  $td->innertext,
                  ENT_COMPAT | ENT_HTML401,
                  'UTF-8'
                )
           );

查看PHP手册页,了解关于字符集编码和实体处理的
html\u entity\u decode()。上述方法应该有效——一个“应该”加50美分就可以给你一杯咖啡:-)

你用什么擦伤?请将您当前的代码添加到您的问题中,使用“代码”按钮格式化。嗯。。。这是一个不同于你之前引用的站点。我的解决方案不再适用,而您的解决方案现在也不起作用,因为在新页面中,您需要查找TR元素,而不是A元素。在该页面中,只有一个元素,它是您正在恢复的。你查过HTML源代码了吗?@iserni。。那么,如何抓住tr呢?@lserni:我很想把这个问题退回去,这样它就符合你的优秀答案了。然而,我不想妨碍你的持续援助:你怎么想?你用什么来解决你的困难?请将您当前的代码添加到您的问题中,使用“代码”按钮格式化。嗯。。。这是一个不同于你之前引用的站点。我的解决方案不再适用,而您的解决方案现在也不起作用,因为在新页面中,您需要查找TR元素,而不是A元素。在该页面中,只有一个元素,它是您正在恢复的。你查过HTML源代码了吗?@iserni。。那么,如何抓住tr呢?@lserni:我很想把这个问题退回去,这样它就符合你的优秀答案了。然而,我不想妨碍你的持续援助:你怎么看?
           $csv[] = strip(
                html_entity_decode (
                  $td->innertext,
                  ENT_COMPAT | ENT_HTML401,
                  'UTF-8'
                )
           );