0

如果我单击“显示更多产品”,我正在尝试抓取一个加载页面的网站。我正在使用 perl 机械化。这是我从网站上得到的内容。我应该在 click_button() 中指定什么以便单击显示更多产品按钮?

  <div id='lPage' style='display:none' class='lpge'>1</div>
  <div class='clearfix'>
    <div id='divMoreProducts' onclick='javascript:showMoreProductsAjax("All Products")' class='showMoreProd' style='display:none;'>
      <span>Show more products</span>
    </div>
    <div id='divMoreProductsLoader' style='display:none;text-align:center'>
      <img src='http://img2.babyoye.com/skin/frontend/default/babyoye_2012/images/ajax-more-loader.gif'>
    </div>
  </div>
  <div id='botControl'>
    <span style='float:right'><strong>Search result </strong>133</span>
  </div>
</article>
<div id='lPage' style='display:none' class='lpge'>1</div>
<script type="text/javascript">var enable_show_more_product = true;</script>
<script type="text/javascript">
  jQuery(document).ready(function(){
    try {
      jQuery("pre.loadme").lazyLoad();
    } catch(e) {
    }
  });
  jQuery(function () {
    jQuery(".showMoreProd").mousedown(function (){
      jQuery(this).addClass("showMoreProdImp");
    }).mouseup(function () {
      jQuery(this).removeClass("showMoreProdImp");
    });
  });
</script>
</div>
4

2 回答 2

3

在浏览器中单击此按钮后,检查实际发出的 HTTP 请求非常容易,只需在代码中使用以下命令重复此类请求

$mech->post( URL, Content => {...} );

我正在使用 Firefox 的HTTPFox扩展来处理这些事情......

于 2013-04-04T09:15:04.003 回答
1

WWW::Mechanize,正如用户手册所述,没有启用 Javascript。您正在尝试单击将触发 Ajax 请求的按钮,因此从 WWW::Mechanize 中“单击”它不会得到任何结果。

在这种情况下,您需要首先分析整个事情,试图了解 Ajax 调用实际执行的请求类型。最简单的方法是使用允许您检查单个请求的浏览器。就个人而言,我喜欢 Google Chrome 的做法:

  1. 在 Chrome 中打开页面
  2. 按 Ctrl - Shift - I 打开开发者面板
  3. 单击面板中的“网络”选项卡,然后单击面板底部的“XHR”按钮。

现在,每次单击发出 Ajax 请求的按钮时,您都会在左侧看到每个请求的列表。如果您单击其中任何一个,您可以看到确切的请求(标​​题、表单字段、请求、响应、时间等)。

并非您在其中看到的所有内容都需要设置。通常,您只需要找到包含触发服务器 Ajax 类型响应的命令的表单字段。其余的通常是 cookie 和 www::Mechanize 已经为您处理的其他东西。

此外,不要忘记$mech->back()在每次发布 Ajax 请求后调用,这样所有当前表单字段都会返回到承载这些按钮的页面的状态。

HTH :-)

弗朗西斯科

于 2013-04-04T14:57:06.063 回答