【问题标题】:Html / Script Scraping Google Map using Hpricot (Ruby On Rails)使用 Hpricot (Ruby On Rails) 抓取 Google 地图的 Html / 脚本
【发布时间】:2009-11-10 16:41:44
【问题描述】:

我在抓取代码时遇到问题,我需要为我正在创建的 Web MashUp 提取信息。

基本上,我正在尝试从以下位置抓取代码:

http://yellowpages.com.mt/Meranti-Ltd-In-Malta-Gozo;/Hair-Accessories;Hijjhkikke=Hiojhhfokje.aspx

这只是我需要抓取的页面之一,因此我无法直接向程序提供我需要的代码 =/。

当我使用以下代码(在 Hpricot 中)抓取页面时

puts open(ypUrl, 'User-Agent'=>'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2') { |f| Hpricot(f) }

我注意到,我看到的不是我需要的代码部分,而是脚本参考,即

<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=false&amp;key=ABQIAAAA8JYIIyGmC1BLOU85GKKkPRSNQenRT-s-Gs-9sYb3ZSBhRRTdcRTMq3zWEID1E35uXl9bdQKIPQIjNQ"></script><title>

Beautimport Ltd (Balmain Hair Extensions) 在马耳他 |黄页?? (马耳他)有限公司 | YellowPages.com.mt

这也是我在 Firefox 上查看源代码时看到的。但是,当我将鼠标悬停在 Firebug 中的元素上时,我能够获得一个 XPath,不幸的是,由于脚本引用仍然如此,它无法正常工作。 (我不确定我的解释是否正确)。由于脚本(目前只能在萤火虫中查看),我真的需要页面上生成的所有代码。我需要这个,以便我可以提取以下内容(通过将鼠标悬停在地图上的 Google 图标上从萤火虫中获取:

<a title="Click to see this area on Google Maps" href="http://maps.google.com/maps?ll=35.88805,14.46627&spn=0.006988,0.015922&z=16&key=ABQIAAAA8JYIIyGmC1BLOU85GKKkPRSNQenRT-s-Gs-9sYb3ZSBhRRTdcRTMq3zWEID1E35uXl9bdQKIPQIjNQ&sensor=false&mapclient=jsapi&oi=map_misc&ct=api_logo" target="_blank">

它给出了以下 Xpath(//表示一个 tbody),但正如我所提到的,因为它没有给出 Hpricot 中的整个代码,所以它非常没用,因为它无法获取它!

/html/body/form/table//tr/td/div/table[2]//tr[2]/td[2]/div/div[2]/table//tr/td/div/div[2]/a

通过这种方式,我将能够提取我的项目真正需要的 Lng 和 Lat。我真的不知道如何使用 Hpricot 以另一种方式解决这个问题,因为它没有给我我需要的所有代码。任何帮助将不胜感激。

【问题讨论】:

    标签: html ruby-on-rails google-maps screen-scraping hpricot


    【解决方案1】:

    这很有趣。它可以做到,但它需要更多的 hpricot。我注意到同时 嗅探正在调用 Web 服务来填充纬度和经度。这是什么 您可以通过以下方式获取该信息:

    像往常一样抓取网站,但要查找对 LoadMap javascript 的调用 功能。该行将类似于:

    <script type='text/javascript'>LoadMapByDetail(1668154, 0, 1)</script>
    

    解析出 id 并调用 web 服务。这最终会看起来像:

    require 'rubygems'
    require 'hpricot' 
    require 'open-uri' 
    require 'soap/wsdlDriver'
    
    WSDL_URL="http://yellowpages.com.mt/Web_Service/SearchMap.asmx?WSDL" 
    soap = SOAP::WSDLDriverFactory.new(WSDL_URL).create_rpc_driver 
    response = soap.GetCoordByDetail(:mainDetailID => '1668154', :type => '1')
    soap.reset_stream response.getCoordByDetailResult.anyType.each { |x| puts x.anyType }
    

    您在输出中看到纬度和经度:

    35.88805
    14.46627
    

    希望这会有所帮助。祝你好运!

    【讨论】:

    • 你真是个天才埃里克!非常感谢您,如果没有您的帮助,我将无法找到解决方案。再次感谢
    【解决方案2】:

    这种类型的屏幕抓取不起作用,因为您试图抓取在页面的 HTML 发送到浏览器之后动态添加到页面的元素。在这种情况下,浏览器是 hpricot,它所看到的只是服务器发送的内容,而不是页面的 javascript 运行后的内容。

    Firebug 可以看到您尝试抓取的元素的原因是 Firebug 会分析浏览器中页面的当前状态,其中包括来自 Google 地图的动态脚本优势。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多