使用Ruby程序实现web信息抓取的教程

2019-09-25 09:45:09王冬梅

使用 Yelp API 检索业务数据

Yelp 公开了一个富 REST API 来执行企业搜索,包含评分、评论和地理搜索(地段、城市、地理编码)。使用 Yelp API,您可搜索一种给定类型的企业(比如 “饭店”)并将搜索限制在一个地理边界内;一个地理坐标附近;或者一个邻居、地址或城市附近。JSON 响应包含了与条件匹配的企业的大量相关信息,包括地址信息、距离、评分、交易,以及其他类型的信息(比如该企业的图片、移动格式信息等)的 URL。

像 LinkedIn 一样,Yelp 使用 OAuth 执行身份验证,所以您必须向 Yelp 注册才能通过该 API 获得一组用于身份验证的凭据。脚本完成身份验证后,可构造一个基于 REST 的 URL 请求。在清单 6 中,我硬编码了一个针对科罗拉多州 Boulder 的饭店请求。响应正文被解析到一个 JSON 对象中并进行迭代,从而发出想要的信息。注意,我排除了已关闭的企业。
清单 6. 使用 Yelp API (yelp.rb) 检索企业数据

#!/usr/bin/ruby
require 'rubygems'
require 'oauth'
require 'json'

consumer_key = 'your consumer key'
consumer_secret = 'your consumer secret'
token = 'your token'
token_secret = 'your token secret'
api_host = 'http://api.yelp.com'

consumer = OAuth::Consumer.new(consumer_key, consumer_secret, {:site => api_host})
access_token = OAuth::AccessToken.new(consumer, token, token_secret)

path = "/v2/search?term=restaurants&location=Boulder,CO"

jresp = JSON.parse(access_token.get(path).body)

jresp['businesses'].each do | business |
  if business['is_closed'] == false
   printf("%-32s %10s %3d %1.1fn", 
        business['name'], business['phone'], 
        business['review_count'], business['rating'])
  end
end

清单 7 中的控制台会话显示了运行 清单 6 脚本的示例输出。为了简单一些,我只显示了所返回的前面一组企业,而不是支持该 API 的限制/偏移特性(以执行多个调用来检索整个列表)。这段示例输出显示了企业名称、电话号码、收到的评论数和平均评分。
清单 7. 演示 Yelp API Ruby 脚本

$ ./yelp.rb
Frasca Food and Wine       3034426966 189 4.5
John's Restaurant         3034445232  51 4.5
Leaf Vegetarian Restaurant    3034421485 144 4.0
Nepal Cuisine           3035545828  65 4.5
Black Cat Bistro         3034445500  72 4.0
The Mediterranean Restaurant   3034445335 306 4.0
Arugula Bar E Ristorante     3034435100  48 4.0
Ras Kassa's Ethiopia Restaurant  3034472919 101 4.0
L'Atelier             3034427233  58 4.0
Bombay Bistro           3034444721  87 4.0
Brasserie Ten Ten         3039981010 200 4.0
Flagstaff House          3034424640  86 4.5
Pearl Street Mall         3034493774  77 4.0
Gurkhas on the Hill        3034431355  19 4.0
The Kitchen            3035445973 274 4.0
Chez Thuy Restaurant       3034421700  99 3.5
Il Pastaio            3034479572 113 4.5
3 Margaritas           3039981234  11 3.5
Q's Restaurant          3034424880  65 4.0
Julia's Kitchen                 8 5.0

$