屏幕抓取ASP.NET网页以检索网格视图中显示的数据

时间:2009-03-25 16:51:28

标签: ruby screen-scraping

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

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

超链接的一个例子: -

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

4 个答案:

答案 0 :(得分:2)

您需要弄清楚实际的网址。

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

选项1b:同上,但有红宝石做。如果您使用Net:HTTP获取页面,那么您已经拥有了查找__doPostBack定义的工具(正文为字符串,ruby的grep以及请求其他文件的功能,例如脚本标签)。

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

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

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

编辑(回复您对其他问题的评论):

假设您使用的是Net:HTTP库,只需将get替换为post即可进行回发。 my_http.post(my_url)代替my_http.get(my_url)

编辑(回应danieltalsky的回答):

watir 对你来说可能是一个非常好的解决方案(我因为没有想到它而踢我自己),但要注意你可能必须manually fire the event或通过其他箍得到你想要的。作为一个具体的问题,对于任何这样的异步提取,你需要确保在你刮掉它之前已经回复了完整的响应;当你自己内联请求时,这不是问题。

答案 1 :(得分: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

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

Watir:http://wtr.rubyforge.org/

答案 2 :(得分:1)

您必须执行回发。数据通过表单POST传递回服务器。就像Markus说的那样使用像FireBug或IE 8中的开发者工具和小提琴手来观看流量。但老实说,这是一个使用臃肿的GridView的网络表单,你将进入一个有趣的冒险。 ;)

答案 3 :(得分:0)

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

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