使用JavaScript回发来刮取HTML

mpe*_*pen 2 html php web-scraping

我正试图抓取一些HTML(经作者许可).我正在使用这里建议的PHP库,它运行良好,直到我遇到一个如下所示的链接:

<a href="javascript:__doPostBack('dgItem$_ctl2$_ctl0','')">
Run Code Online (Sandbox Code Playgroud)

我认为这是一些asp.net的事情.当我点击它时,它不会改变URL,它只是将一些新内容加载到页面中,我也想抓一下.

我怎么能绕过这个?

我想我需要模拟点击,但在处理原始HTML时我不能这样做,我需要某种浏览器/ JS解释器,不是吗?

是否有更适合此任务的库?我不仅限于PHP,但它是首选.

Jon*_* S. 7

__doPostBack()确实是一个ASP.NET的东西.这是函数的作用:

var theForm = document.forms['FORMNAME'];
if (!theForm) {
    theForm = document.FORMNAME;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,它将两个隐藏字段(__EVENTTARGET__EVENTARGUMENT)的值设置为参数的相应值.然后它提交表格.

如果您愿意,可以继续使用PHP HTML解析器来完成这项工作,但是当您遇到其中一个__doPostBack()链接时,您必须手动制作POST请求.从高层次来看,你会看到这样的事情:

  1. 获取当前的表单值.您可能需要循环遍历每个input元素等,并将值添加到数组中.如果在页面上没有文本框,复选框,等等,你只应留下的隐藏字段.NET嵌入在默认情况下(如__VIEWSTATE,__EVENTVALIDATION等).
  2. 解析出传递给值doPostBack()并覆盖现有值__EVENTTARGET__EVENTARGUMENT.
  3. 制作您的POST请求.我不确定你所看到的库是什么(如果有的话)提供这种方式,但是从PHP执行此操作的一种流行方式是通过cURL扩展.有关示例,请参阅http://davidwalsh.name/execute-http-post-php-curl.
  4. 获取HTML结果并像往常一样使用库进行解析.

或者,如果您总是向同一页面发出几乎相同的请求,则可以跳过解析表单的一些步骤,然后直接跳转到制作POST请求.

这不会有很多乐趣,但它适用于这种情况.如果你需要处理涉及JS的更复杂的案例,或者你只是想以不同的方式处理它,那么(如你所提到的)库基本上可以驱动浏览器并为你处理这些事情.首先想到的两个是:

还有其他选项,但我不知道任何可以快速轻松地集成到现有PHP脚本中的选项.