使用cURL和xpath进行Php屏幕抓取

时间:2011-03-23 15:42:37

标签: php curl web-scraping

我正在尝试使用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中使用它了吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

你的问题的简短回答是“不”; 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 :一个在大多数流行语言中实现的Web库(我所知道的至少在Perl中的Ruby,Python和(我相信的)。

  • 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

答案 2 :(得分:0)

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

但是,您必须注意代码中定义的路径。

echo file_get_contents($url);