使用 JavaScript 回发抓取 HTML
Posted
技术标签:
【中文标题】使用 JavaScript 回发抓取 HTML【英文标题】:Scraping HTML with JavaScript postbacks 【发布时间】:2012-06-28 08:04:09 【问题描述】:我正在尝试抓取一些 html(经作者许可)。我使用的是 php 库 suggested here,它运行良好,直到我遇到如下所示的链接:
<a href="javascript:__doPostBack('dgItem$_ctl2$_ctl0','')">
我相信这是一些 asp.net 的东西。当我点击它时,它不会更改 URL,它只是将一些新内容加载到页面中,我也想抓取这些内容。
我该如何解决这个问题?
我想我需要模拟点击,但在处理原始 HTML 时我不能这样做,我需要某种浏览器/JS 解释器,不是吗?
是否有更适合此任务的库?我不限于 PHP,但它是首选。
【问题讨论】:
正在阅读this article... 您可能对this project感兴趣 @pguardiario:它说它做表单和cookie,但没有提到JS。 再看一下,它专门执行您所说的 doPostBack 操作。 @pguardiario:啊..虽然这可能适用于这个项目,但它仍然不如完全支持 JS 的东西通用,不是吗?不过可能要快很多。如果再出现这种情况,我会调查的。谢谢! 【参考方案1】:__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 的更复杂的案例,或者您只是想以不同的方式处理这个问题,那么(正如您所提到的)库基本上可以驱动浏览器并为您处理这些事情。首先想到的两个是:
Selenium WebDriver PhantomJS还有其他选项,但我不知道有什么可以快速轻松地集成到现有 PHP 脚本中。
【讨论】:
刚刚启动 PHP 脚本,所以我并不太担心是否必须重新开始,但我确实喜欢这个库的类 jQuery 语法。我将研究您建议的 2 个库,如果这些库不起作用,我可能会按照您的建议尝试破解该帖子。谢谢!【参考方案2】:我最终将 Python 与 Selenium Firefox 网络驱动程序一起使用。由于我使用的是真正的浏览器,所以我可以做任何 FF 可以做的事情。
【讨论】:
以上是关于使用 JavaScript 回发抓取 HTML的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jquery/javascript 捕获页面上的所有回发?
UpdatePanel 异步回发后的 Javascript 事件订阅
ASP 菜单:如何避免回发并使用 Javascript 客户端脚本访问选定的值