2

我正在使用 RUBY 筛选使用 gridview 显示数据的网页(在 asp.net 中创建)。我能够成功读取网格第 1 页上显示的数据,但无法弄清楚如何移动到网格中的下一页以读取所有数据。

问题是页码超链接不是普通的超链接(带有 URL),而是导致回发到同一页面的 javascript 超链接。

超链接的一个例子: -

<a href="javascript:__doPostBack('gvw_offices','Page$6')" style="color:Black;">6</a>
4

4 回答 4

2

您需要找出实际的 URL。

选项 1a:在具有良好开发人员支持的浏览器中打开页面(例如带有 web 开发工具的 firefox)并查看源代码以找到_doPostBack定义的位置。找出它正在构建的 URL。请注意,它可能不在主页源中,而是在页面加载的内容中。

选项 1b:同上,但是让 ruby​​ 来做。如果您使用 Net:HTTP 获取页面,您已经拥有找到__doPostBack已经定义的工具(作为字符串的主体,ruby 的 grep,以及请求其他文件的能力,例如脚本标签中的那些)。

选项 2:监控浏览器和页面之间的流量(例如使用日志代理)以找出 URL 是什么。

选项 3:询问网页的所有者。

选项4:猜测。这可能不像听起来那么糟糕(例如,如果原始 URL 以“...?page=1”或其他东西结尾),但通常这是最不可能工作的。

编辑(回应您对另一个问题的评论):

假设您使用的是 Net:HTTP 库,您可以通过将 your 替换get为 a来进行回发post,例如,my_http.post(my_url)而不是my_http.get(my_url)

编辑(响应 danieltalsky 的回答):

watir对您来说可能是一个非常好的解决方案(我因为没有想到它而自责),但请注意,您可能必须手动触发事件或通过其他箍来获得您想要的东西。作为一个特定的问题,对于像这样的任何异步获取,您需要确保在抓取之前完整的响应已经返回;当您自己进行内联请求时,这不是问题。

于 2009-03-25T17:02:13.987 回答
2

如果您已经在使用 ruby​​ 进行处理,我建议使用 Watir,这是一个为浏览器测试而设计的 ruby​​ 库。一方面,它为页面上的 DOM 元素提供了一个更好的界面,并且它使单击这样的链接更容易:

ie.link(:text, '6').click

然后,当然你也有更简单的方法来导航表格。自动化这个过程很容易:

1..total_number_of_pages.each do |next_page|

  ie.link(:text, next_page).click
  # table processing goes here

end

我不知道您的用例,但这种方法有其优点和缺点。一方面,它实际上运行一个浏览器实例,所以如果这是您需要经常在后台以完全自动化的方式安静地运行的东西,这可能不是最好的方法。另一方面,如果可以启动浏览器实例,那么您不必担心所有这些回发废话,您只需单击链接,就像您是用户一样。

瓦提尔:http ://wtr.rubyforge.org/

于 2009-03-25T17:07:46.643 回答
1

您将不得不执行回发。数据通过表单 POST 传递回服务器。就像 Markus 所说的那样,使用 FireBug 或 IE 8 中的开发人员工具和提琴手来观察流量。但老实说,这是一个使用臃肿的 GridView 的 Web 表单,您将进行一次有趣的冒险。;)

于 2009-03-25T17:09:56.653 回答
0

您需要进行一些调查才能确定 javascript 执行正在执行的 HTTP 请求。我使用 Mozilla 浏览器和 Firebug 插件以及“Live HTTP Headers”插件来帮助确定发生了什么。您可能会很清楚您需要提出哪些请求才能遍历到下一页。确保您注意设置的任何 cookie。

我在使用Mechanize进行抓取方面取得了非常好的成功。它包装了所有的 HTTP 通信、html 解析和搜索(使用Nokogiri)、重定向和保存 cookie。但它不知道如何执行 Javascript,这就是为什么您需要自己弄清楚要执行的 http 请求的原因。

于 2009-03-25T18:47:40.380 回答