【问题标题】:Php screen scraping with cURL and xpath使用 cURL 和 xpath 进行 PHP 屏幕抓取
【发布时间】:2011-07-21 10:32:36
【问题描述】:

我正在尝试使用 xpath 来抓取一个站点,但初始站点是一个小部件而不是原始 html,所以我需要某种方式来执行小部件代码来获取 html。

我要抓取的网址是:https://www.dealcurrent.com/customwidget.php?publisherID=36&widget=largewidget

如果我回显 curl_exec 返回的 $html,它会给我正确呈现的 html,但如果我直接打印出 $html,它会给我类似的东西:

<br />[ ]<br>[ try {if(window.top.location==document.URL) document.write('<meta http-equiv=refresh content="0;url=\'http://www.sweetfind.com/\'"/>'); } catch(e) {}Sweet Findif(34>=10000) window.location.href="https://www.dealcurrent.com/customwidget.php?widget=largewidget_soldout&publisherID=36"; #nav a:link { color:#666666; font-family:Arial, Helvetica, sans-serif; font-size:12px; text-decoration:none; } #nav a:visited { font-family:Arial, Helvetica, sans-serif; color:#666666; text-decoration:none; font-size:12px; text-decoration:none; } #nav a:hover { font-family:Arial, Helvetica, 

等等……

有什么方法可以“执行”上面的代码来获取 html 输出,以便我可以将它与 xpath 一起使用?

【问题讨论】:

  • 你试过关注位置吗
  • javascript 似乎正在插入一个 html meta -edirect(因此跟随位置可能不起作用)。你能指定你试图抓取的哪个页面吗?如果它是您被重定向到的任何内容,只需使用 strpos 来分解元重定向。

标签: php curl web-scraping


【解决方案1】:

Curl 只为您提供 HTML 输出,并且不能执行 javascript,因为它不是浏览器。最好的办法是在 Javascript 执行后找到另一个抓取工具(例如 Selenium)来抓取页面的内容。卷曲在这里可能对你没有好处。

【讨论】:

    【解决方案2】:

    您的问题的简短回答是“否”; cURL 不支持 JavaScript(它可能永远不会,因为它不是为它构建的),任何 PHP 库也不支持。请参阅下面的选项列表:

    对 JavaScript 进行逆向工程

    如果您只需要这样做一次,那么切换工具可能不是最好的解决方案(具有代码库兼容性等等)。在这种情况下,您可以尝试在代码中手动模拟 JavaScript 的效果;如果它显示window.location="example.com",则获取“example.com”;如果它填写并提交表单,则发送 POST 请求。但是,您可能很快就会厌倦 - 我知道我已经厌倦了。

    在这种特定情况下,如果您尝试捕获您被重定向到的页面,您可以尝试使用 strpossubstr 来分解 JavaScript 插入的元重定向, 以获取 url,然后简单地按照它。

    PHP/cURL 的替代品

    对于 PHP,目前没有任何工具(据我所知)允许您执行 JavaScipt(或 Flash),这是您在抓取时最终会遇到的;我一直在努力寻找解决方案。 (如果你找到了,请告诉我。)所以,当你最终厌倦了在页面上“模拟”正确的脚本时。

    请注意,您将主要使用的是用于 Web 应用程序测试的工具;这些只是非常适合刮擦。

    • Watir:目前为止我发现的用于完整 JavaScript 和 Flash 执行的最佳工具是 Watir,它允许您从 Ruby 控制任何主流浏览器的实例;我知道它已被移植到 Java 和 .Net,但我从未使用过这些实现中的任何一个。请注意,Watir 也有一个非常易于使用的 XPath 实现:

    • Mechanize:一个网络库,在大多数流行语言中都有实现(我所知道的至少是 Ruby、Python 和(我相信是原始的)Perl 语言。 p>

    • Selenium:正如 Hisoka 所说,Selenium 也是一种受人尊敬的工具。

    • HtmlUnit:另一个好工具(它偶尔会在 JavaScript 上中断,据我所知没有实现任何 Flash 执行)是 HtmlUnit,它是一个 Java 库。我已经使用了一段时间,它给我的印象是“笨重”,这是一个核心的 webapp 测试工具。 (这是一件坏事,因为您可能不想要 HTML 和 CSS 错误报告。)

    (请注意,这绝不是一个完整的列表。)

    代码示例

    使用 Watir 的示例:

    browser = Watir::Browser.new
    browser.goto("example.com")
    browser.h1(:xpath, "//h1[@id='header']").click
    

    【讨论】:

      【解决方案3】:

      我不确定这是否是您要找的东西?

      但是,您必须小心代码中定义的路径。

      echo file_get_contents($url);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        相关资源
        最近更新 更多