我正在尝试抓取一些HTML(经作者许可)。我正在使用这里建议的 PHP 库,它运行良好,直到我遇到如下所示的链接:
<a href="javascript:__doPostBack('dgItem$_ctl2$_ctl0','')">
我相信这是一些 asp.net 的事情。当我单击它时,它不会更改URL,它只是将一些新内容加载到页面中,我也想抓取这些内容。
我该如何解决这个问题?
我想我需要模拟点击,但在处理原始 HTML 时我不能这样做,我需要某种浏览器/JS 解释器,不是吗?
有没有更适合此任务的库?我不仅限于PHP,但它是首选。
__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();
}
}
基本上,它将两个隐藏字段(__EVENTTARGET
和__EVENTARGUMENT
)的值设置为参数的相应值。然后提交表单。
如果你愿意,你可以继续使用 PHP HTML 解析器来完成这项工作,但是当你遇到这些__doPostBack()
链接之一时,你必须手动制作一个 POST 请求。在高层次上,你会看到这样的东西:
- 获取当前表单值。您可能必须遍历每个
input
元素等,并将值添加到数组中。如果页面上没有文本框、复选框等,则默认情况下只保留 .NET 嵌入的隐藏字段(例如,__VIEWSTATE
、__EVENTVALIDATION
等)。 - 解析出传递给
doPostBack()
的值,并覆盖__EVENTTARGET
和__EVENTARGUMENT
的现有值。 - 制作您的 POST 请求。我不确定您正在查看的库以这种方式提供了什么(如果有的话),但是从 PHP 执行此操作的一种流行方法是通过 cURL 扩展。有关示例,请参阅 http://davidwalsh.name/execute-http-post-php-curl。
- 获取 HTML 结果并像往常一样使用库进行分析。
或者,如果您总是对同一页面发出几乎相同的请求,则可以跳过解析表单的一些步骤,直接跳转到制作 POST 请求。
这不会很有趣,但它适用于这种情况。如果你需要处理涉及JS的更复杂的情况,或者你只是想以不同的方式处理这个问题,那么(正如你提到的)有一些库基本上驱动浏览器并为你处理这些事情。首先想到的两个是:
- 硒网络驱动程序
- 幻影
还有其他选择,但我不知道有任何选项可以快速轻松地集成到现有的PHP脚本中。
我最终将Python与Selenium Firefox Web驱动程序一起使用。由于我使用的是真正的浏览器,因此我可以做FF可以做的所有事情。