Ruby中的Web Scraping:刮取数据库中的数据的问题

时间:2014-09-18 18:31:48

标签: css ruby web web-scraping

我试图从页面中提取度假村的姓名,地址,电话号码和电子邮件地址

http://www.exploreminnesota.com/places-to-stay/resorts/?keywords=&pageIndex=0&radius=0&mapTab=false&sortOrder=asc&sort=randomdaily&locationid=&startDate=false&class_id=7&lat=&lon=&city=&pageSize=20&type=reitlistings&attrFieldsOr=

我是Ruby的新手并且已经找了一些例子,但这似乎太具体了,无法找到合适的解决方案。

关注电子邮件地址元素。检查元素'并采用CSS路径(#category-listings> li:nth-​​child(1)> div> div> ul> li:nth-​​child(2) > a)

我编写了ruby脚本来尝试提取这些数据:

require 'nokogiri'
require 'open-uri'

PAGE_URL = "http://www.exploreminnesota.com/places-to-stay/resorts/?keywords=&pageIndex=0&radius=0&mapTab=false&sortOrder=asc&sort=randomdaily&locationid=&startDate=false&class_id=7&lat=&lon=&city=&pageSize=20&type=reitlistings&attrFieldsOr="

page = Nokogiri::HTML(open(PAGE_URL))

site1 = page.css(' #category-listings  li:nth-child(1)  div  div  ul  li:nth-child(2) a')
puts site1

输出:

href="mailto:**%7B%7Br._source.database_fields.email%7D%7D"** class="button gaTracker" title="**{{r._source.database_fields.email}}**" data-tracker-type="event" data-category="Email" data-label="{{r._source.location.split('/')[1]}}" data-action="{{url | analyticsAction}}">Email

正如您所看到的,我想要的电子邮件地址,标题显示为通话: r._source.database_fields.email

检查此元素时,数据显示为:

href="mailto:vacation@gull4seasons.com" class="button gaTracker" title="vacation@gull4seasons.com" data-tracker-type="event" data-category="Email" data-label="gull-four-seasons-resort" data-action="Places to Stay">Email

我不确定如何访问数据,如浏览器建议中所示。任何帮助将不胜感激,也将帮助我理解HTML / CSS,以及如何将数据从数据库中拉入页面。

谢谢!

1 个答案:

答案 0 :(得分:1)

以下代码将向exploreminnesota.com发出GET请求,仅 您想要的JSON数据 - 即,您不再需要Nokogiri。然后它会将响应(一个临时文件)转换为一个Ruby JSON对象,并将该对象漂亮地打印到终端。

require "open-uri"
require "json"

url = "http://www.exploreminnesota.com/getJsonData.ashx?id=61&keywords=&pageIndex=0&radius=0&mapTab=false&sortOrder=asc&sort=randomdaily&locationid=&startDate=false&class_id=7&lat=&lon=&city=&pageSize=20&type=reitlistings&attrFieldsOr="

response_file = open(url) # Make HTTP request and save as temp file
response_json = JSON.parse(response_file.read) # Convert response to JSON

puts JSON.pretty_generate(response_json)

请注意分配给getJsonData.ashx的网址中的url - 此网址将检索JSON数据而非HTML。

我使用Chrome检查器找到了url。在检查器中,转到网络选项卡,选中"禁用缓存,"刷新页面,并过滤" XHR"请求类型。在这里,您将看到浏览器在初始页面加载后所做的XHR请求和响应列表(我计算了6)。现在过滤单词" city"你应该看到你关心的一个网络请求。单击它,然后单击"预览"选项卡 - 现在,您可以通过展开和折叠对象来检查检查器中的JSON响应。

如果您在上面的示例中添加以下行:

puts response_json["hits"]["hits"][0]["_source"]["database_fields"]["email"]

它将打印第一个度假村的电子邮件地址。