【问题标题】:Scraping ASP.NET site with Ruby使用 Ruby 抓取 ASP.NET 站点
【发布时间】:2011-02-18 20:35:41
【问题描述】:

我想使用 Ruby 抓取这个 ASP.NET 站点的搜索结果,最好只使用 Hpricot(我无法打开 Firefox 实例):http://www.ngosinfo.gov.pk/SearchResults.aspx?name=&foa=0

但是,我无法弄清楚如何浏览每页结果。基本上,我需要模拟点击这些链接:

<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$Pager1$2','')" class="blue_11" id="ctl00_ContentPlaceHolder1_Pager1">2</a>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$Pager1$3','')" class="blue_11" id="ctl00_ContentPlaceHolder1_Pager1">3</a>

等等

我尝试使用 Net::HTTP 来处理帖子,但是虽然收到了正确的 HTML,但没有搜索结果(我可能没有正确执行此操作)。另外,页面的url不包含任何指示页面的参数,所以不能强制这样的结果。

任何帮助将不胜感激。

【问题讨论】:

标签: asp.net ruby screen-scraping


【解决方案1】:

如果您刚刚开始,您可能需要查看Nokogiri。它比 Hpricot 更多 lightweight and better-documented(它似乎已被废弃)。

编辑:Jakub Hampl 是正确的 - Mechanize 是您要与网站交互的内容。它与 Nokogiri(解析 HTML 和 XML)合作。

【讨论】:

    【解决方案2】:

    更好地检查机械化。屏幕抓取的一个很好的起点是 railscasts.com 关于 mechanize 的插曲。

    【讨论】:

    • 不幸的是,Mechanize 不处理 Javascript 链接。我对 ASP.NET 一点都不熟悉,但是有没有办法手动模仿 Javascript 正在做什么?
    • 对不起,我对 asp.net 几乎一无所知。也许看看 __doPostBack 到底做了什么并获取 url 会有所帮助?还有你在什么平台?你总是可以利用一个完整的 Webkit 实例——尽管对于这么简单的事情来说这似乎有点矫枉过正。
    • 我的应用程序当前在共享的 Unix 服务器上运行(因此我无法启动 Firefox 实例)。单击链接后,URL 保持不变。发出的 POST 请求类似于“__EVENTTARGET=ctl00%24ContentPlaceHolder1%24Pager1%242&__EVENTARGUMENT=”,然后是 __VIEWSTATE 的东西,但值太长无法粘贴到此处。我试图阅读这些东西的文档,但实际上没有 ASP.NET 经验,所以对我来说并不是特别清楚。谢谢!
    【解决方案3】:

    使用 mechanize-1.0.0 进行以下工作:

     agent = Mechanize.new
     page = agent.get('http://127.0.0.1/some.aspx')
    
     form = page.form("aspnetForm")
     form.add_field!('__EVENTARGUMENT', 'Page$2')
     form.add_field!('__EVENTTARGET', 'ctl00$ContentPlaceHolder1$gvwSomeList')
     page = agent.submit(form) # this gets page 2
    

    【讨论】:

    • 这是正确答案。只需更改 __EVENTTARGET 和表单的值即可。
    • 在同一表单中循环访问一组链接时,我使用form#add_field!form#submit,然后使用form#delete_field!__EVENTTARGET(以及任何其他必要的字段)。这样可以避免在迭代时向表单添加多个同名字段。机械化是天赐之物。在最近的一个案例中,它获取了 174 个表单字段及其值 - 我只需添加适当的 __EVENTTARGET 字段和值即可使其正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    相关资源
    最近更新 更多