0

我正在尝试筛选一个网页(使用 Mechanize),它以网格页面的方式显示记录。我能够读取第一页中显示的值,但现在需要导航到下一页以读取适当的值。

<tr>
    <td><span>1</span></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$2')">2</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$3')" >3</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$4')" >4</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$5')" >5</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$6')">6</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$7')" >7</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$8')">8</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$9')" >9</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$10')" >10</a></td>
    <td><a href="javascript:__doPostBack('gvw_offices','Page$11')">...</a></td>
</tr>

我能够通过所有链接但是当我尝试这个时: -

links = (row/"a")
links.each do |link|
    agent.click link.attributes['href']   # This fails 
    agent.click link   # This also fails
end

原因是 agent.click 期望 URL 作为参数。

有没有一种方法可以在页面显示时读取所有值?如果不是,当 href 是回发而不是 URL 时,我们怎么能有这样的点击操作?

4

4 回答 4

5

Mechanize 不能处理 javascript,所以基本上你有两个选择:

  • 使用scrubyt和 firewatir:这是一种编写浏览器脚本的方法(因此 Firefox 处理 javascript 部分)
  • 手动检查base url并动态添加页码

就像是:

base_url = 'http://example.com/gvw_offcies&page='
links.each do |link|
  page_number = ... #get the page number from link
  agent.get base_url+page_number
end
于 2009-03-21T18:56:08.163 回答
1

上面的所有解决方案我过去已经尝试了很长时间(尤其是 Celerity),但我的结论是它们都很糟糕并且有严重的缺点,这让生活变得非常困难,因为它们基于相同的 HtmlUnit 引擎处理 Javascript。

Celerity 不是屏幕抓取工具,它缺少 Windows 管理,并且基于 HTMLUNIT 引擎,在处理 Javascript 方面一点也不擅长。但是,对于使用最低到中等级别的 Javascript 和 AJAX 请求的站点,它可以快速运行。它基于 ruby​​,这对于那些不喜欢 Java 的人来说是一种解脱。

你最好的选择是使用 Selenium WebDriver API。这需要在您的 linux 服务器上显示 X,并且它比 HtmlUnit 慢,但它不会让您烦恼使用任何派生或包装 HtmlUnit 时会遇到的许多问题。有一个使用 HtmlUnit 的选项,但是你牺牲了准确性和一致性来换取速度。HtmlUnit 的抓取速度要快得多。

但是,抓取不属于您的其他网站的速度总是不是一件好事,因为它通常会导致 IP 禁令。

我个人的建议是远离使用 HtmlUnit 引擎的任何事情,并使用 Selenium 直接远程控制您选择的浏览器,以获得最大的准确性和可靠性。

于 2010-09-23T19:36:41.817 回答
0

您可以尝试在 Jruby 中使用 Celerity 并将页面传递给 HTML 解析库。Celerity 应该与 Watir 兼容 API,并且是 HtmlUnit 的包装器。我使用 mechanize 进行数据收集,但对于一些用 JS 生成的站点,我不得不切换到这个。

http://celerity.rubyforge.org/

于 2010-01-20T22:03:48.777 回答
0

我会使用类似webscarab的东西来简单地查看 Javascript 所做的 POST 请求的实际去向。特别是对于 AJAX 的东西,无论如何它们只是 HTTP 请求。
只需启动它并将其设置为 Firefox 中的代理。大多数时候,您可以看到某种模式,然后直接抓取这些 URL

于 2009-12-12T11:10:08.623 回答