Извлечение информация из Интернета при использовании языка Ruby

Использование программных средств веб-скрейпинга и API-интерфейсов веб-сайта для автоматического извлечения данных из Интернета

В статье рассматриваются новейшие методы для извлечения структурированной информации из Интернета. С использованием примеров на базе Ruby-скриптов автор статьи M. Тим Джонс демонстрирует применение технологии веб-скрейпинга и API-интерфейсов веб-сайтов для целенаправленного извлечения данных.

М. Тим Джонс, инженер-консультант, Emulex

M. Тим Джонс (M. Tim Jones) является архитектором встраиваимого программного обеспечения и автором работ: Программирование Приложений под GNU/Linux, Программирование AI-приложений и Использование BSD-сокетов в различных языках программирования. Он имеет опыт разработки процессоров для геостационарных космических летательных аппаратов, а также разработки архитектуры встраиваемых систем и сетевых протоколов. Сейчас Тим работает инженером-консультантом в корпорации Эмулекс (Emulex Corp.) в г.Лонгмонт, Колорадо.



22.05.2014

Веб-сайты больше не ограничиваются обслуживанием читателей из числа людей. В настоящее время многие сайты поддерживают API-интерфейсы, которые позволяют компьютерным программам собирать информацию. Веб-скрейпинг (Screen scraping)— проверенная временем технология для синтаксического преобразования HTML-страниц в более удобные для потребления формы — по-прежнему способна приносить пользу. Однако возможности, упрощающие извлечение веб-данных с помощью API-интерфейсов, быстро развиваются. Согласно данным ресурса ProgrammableWeb, на момент опубликования этой статьи было доступно более 10000 API-интерфейсов веб-сайтов — т. е. за предшествующие 15 месяцев их количество выросло более чем в 3000 раз (сайт ProgrammableWeb также предлагает API-интерфейс для поиска и извлечения API-интерфейсов, mashup-приложений, профилей участников и других данных из своего каталога).

В начале этой статьи рассматривается современное состояние технологии веб-скрейпинга и производится ее сравнение с подходом на основе API-интерфейсов. Затем, с использованием примеров на языке Ruby, демонстрируется, как с помощью API-интерфейсов извлекать структурированную информацию из некоторых распространенных свойств веб-контента. Предполагается, что читатель статьи на базовом уровне знаком с такими областями, как язык Ruby, концепция REST (Representational State Transfer), формат данных JSON (JavaScript Object Notation) и формат данных XML.

Сравнение подходов на основе веб-скрейпинга и на основе API-интерфейсов

На данный момент имеется несколько решений для веб-скрейпинга. Некоторые из них преобразуют формат HTML в другие форматы, такие как JSON, что упрощает извлечение желаемого контента. Другие решения читают непосредственно HTML-код и позволяют пользователю определить контент как функцию HTML-иерархии, в которой размечены данные. К этой категории относится, в частности, решение Nokogiri, которое поддерживает парсинг HTML-документов и XML-документов средствами языка Ruby. Имеется еще два инструмента с открытым исходным кодом для веб-скрейпинга: pjscrape для JavaScript и Beautiful Soup для Python. Инструмент pjscrape базируется на использовании командной строки и способен проанализировать полностью отображенную страницу, включая JavaScript-контент. Инструмент Beautiful Soup прозрачно интегрируется в среды Python 2 и Python 3.

Предположим, что с помощью инструмента Nokogiri мы хотим воспользоваться технологией веб-скрейпинга для установления количества сотрудников IBM согласно сведениям базы данных CrunchBase. Первый шаг состоит в том, чтобы понять разметку конкретной HTML-страницы на сайте CrunchBase, на которой указано количество сотрудников IBM. На рис. 1 показана эта страница, открытая в инструменте Firebug в браузер Mozilla Firefox. В верхней половине изображения находится отображенный HTML, а нижняя половина показывает исходный HTML-код интересующего нас раздела.

Рисунок 1. Просмотр исходного HTML-кода с помощью инструмента Firebug в браузере Firefox
Screen capture of viewing HTML source with Firefox's Firebug

Ruby-скрипт в листинге 1 использует Nokogiri для анализа количества сотрудников на веб-странице, показанной на рис. 1.

Листинг 1. Парсинг HTML-кода с помощью Nokogiri (parse.rb)
#!/usr/bin/env ruby
require 'rubygems'
require 'nokogiri'
require 'open-uri'

# Определить URL с помощью аргумента, передаваемого пользователем
uri = "http://www.crunchbase.com/company/#{ARGV[0]}"

# Использовать Nokogiri для получения документа
doc = Nokogiri::HTML(open(uri))

# Найти нужную ссылку
link = doc.search('tr span[1]')

# Возвратить контент, ассоциированный с этой ссылкой
puts link[0].content

В исходном HTML-коде, который отобразил инструмент Firebug (рис. 1), можно увидеть, что интересующие нас сведения (количество сотрудников) встроены внутрь HTML-тега <span> с уникальным идентификатором ID. Тег <span id="num_employees"> является первым из двух тегов <span>с ID. Таким образом, последние две инструкции в листинге 1 запрашивают первый тег <span> а затем возвращают контент этой проанализированной ссылки.

Сайт CrunchBase также предоставляет интерфейс типа REST API, который обеспечивает доступ к значительно большему объему данных, чем при использовании скрейпинга. В листинге 2 демонстрируется использование этого API-интерфейса для извлечения количества сотрудников компании с сайта CrunchBase.

Листинг 2. Использование интерфейса CrunchBase REST API с JSON-парсингом (api.rb)
#!/usr/bin/env ruby
require 'rubygems'
require 'json'
require 'net/http'

# Определить URL с помощью аргумента, передаваемого пользователем
uri = "http://api.crunchbase.com/v/1/company/#{ARGV[0]}.js"

# Выполнить HTTP-запрос GET и возвратить ответ
resp = Net::HTTP.get_response(URI.parse(uri))

# Проанализировать JSON-код из тела ответа
jresp = JSON.parse(resp.body)

# Возвратить искомый контент
puts jresp['number_of_employees']

В листинге 2 мы определяем URL (с названием компании, переданным как аргумент скрипта). Затем мы используем HTTP-класс для выполнения запроса GET и получения ответа. Этот ответ анализируется как JSON-объект, а обращение к искомому элементу осуществляется посредством структуры данных Ruby.

Консольный сеанс в листинге 3 показывает результаты исполнения скрипта скрейпинга, показанного в листинге 1, и скрипта на основе API-интерфейса, показанного в листинге 2.

Листинг 3. Демонстрация подходов на основе скрейпинга и на основе API-интерфейса
$ ./parse.rb ibm
388,000
$ ./api.rb ibm
388000
$ ./parse.rb cisco
63,000
$ ./api.rb cisco
63000
$ ./parse.rb paypal
300,000
$ ./api.rb paypal
300000
$

После исполнения скрипта скрейпинга мы получаем отформатированное число, а скрипт на основе API-интерфейса предоставляет необработанное целое число. Как показано в листинге 3, вы можете обобщить использование любого из этих скриптов и запросить количество сотрудников любой другой компании, которую отслеживает сайт CrunchBase. Такая универсальность вполне возможна благодаря стандартизованной структуре URL, фигурирующих в каждом из описываемых подходов.

Итак, что мы можем получить при использовании подхода на основе API-интерфейса? В случае скрейпинга нам необходимо углубляться в HTML-код с целью понять его структуру и найти данные для извлечения. Гораздо проще осуществить парсинг HTML-кода с помощью Nokogiri и отыскать интересующие нас данные. Однако в случае изменения структуры HTML-документа может потребоваться модификация скрипта с целью корректного парсинга новой структуры. Подход на основе API-интерфейса не создает таких проблем до тех пор, пока действует контракт API-интерфейса. Другое важное преимущество подхода на основе API-интерфейса состоит в том, что он позволяет обращаться ко всем данным, которые представляются через этот интерфейс посредством возвращаемого JSON-объекта. Объем данных, которые веб-сайт CrunchBase предоставляет для потребления человеком в форме HTML, значительно меньше.

Теперь мы рассмотрим использование некоторых других API-интерфейсов с целью извлечения различных видов информации из Интернета (как и прежде — с помощью Ruby-скриптов). Сначала я покажу, как осуществлять сбор личных данных на сайте социальной сети. Затем вы увидите, как искать "менее личные" данные при посредстве API-интерфейсов в других источниках.


Извлечение личных данных с сайта LinkedIn

LinkedIn — это веб-сайт социальной сети для поддержки профессиональной деятельности. Эта сеть помогает специалисту связываться с другими специалистами, искать работу, получать информацию об организациях, присоединяться к группам по интересующей его тематике. Кроме того, на веб-сайте LinkedIn действует рекомендательный механизм, способный предлагать участнику этой сети вакансии и компании в соответствии с его профилем.

Пользователи LinkedIn могут обратиться к API-интерфейсам сайта LinkedIn (на основе REST и на основе JavaScript) с целью извлечения информации, которая также доступна для чтения человеком на самом веб-сайте: контактной информации, потоков социальной информации, передаваемой в коллективное пользование, категорий контента, общения (сообщения и приглашения к контакту), информации о компаниях/вакансиях и т. д.

Чтобы использовать API-интерфейс LinkedIn, вам необходимо зарегистрировать свое приложение. После регистрации вы получите ключ и секретный ключ API-интерфейса, а также токен и секретный ключ пользователя. Сайт LinkedIn использует для аутентификации протокол OAuth.

После успешного прохождения аутентификации вы сможете осуществлять REST-запросы с использованием объекта access-token (токен доступа). Ответ представляет собой типовой HTTP-ответ, поэтому вы можете преобразовать тело ответа в JSON-объект. Затем вы можете выполнить итеративное прохождение по JSON-объекту с целью извлечения интересующих вас данных.

Ruby-скрипт в листинге 4 предоставляет аутентифицированному пользователю сайта LinkedIn список рекомендованных компаний и предложения по вакансиям.

Листинг 4. Просмотр компаний и предложений по вакансиям с помощью API-интерфейса LinkedIn (lkdin.rb)
#!/usr/bin/ruby
require 'rubygems'
require 'oauth'
require 'json'

pquery = "http://api.linkedin.com/v1/people/~?format=json"
cquery='http://api.linkedin.com/v1/people/~/suggestions/to-follow/companies?format=json'
jquery='http://api.linkedin.com/v1/people/~/suggestions/job-suggestions?format=json'
 
# Ввести ключи и секретные ключи, которые вы получили после регистрации своего приложения
api_key = 'api key'
api_secret = 'api secret'
user_token = 'user token'
user_secret = 'user secret'
 
# Указать оконечную точку API-интерфейса LinkedIn
configuration = { :site => 'https://api.linkedin.com' }
 
# Использовать ключ и секретный ключ API-интерфейса для инициализации объекта потребителя
consumer = OAuth::Consumer.new(api_key, api_secret, configuration)
 
# Использовать токен и секретный ключ разработчика для инициализации объекта access token
access_token = OAuth::AccessToken.new(consumer, user_token, user_secret)

# Получить имя пользователя для этого профиля
response = access_token.get(pquery)
jresp = JSON.parse(response.body)
myName = "#{jresp['firstName']} #{jresp['lastName']}"
puts "\nSuggested companies to follow for #{myName}"

# Получить список предлагаемых компаний
response = access_token.get(cquery)
jresp = JSON.parse(response.body)

# Выполнить итеративное прохождение и отобразить название каждой компании
jresp['values'].each do | company |
    puts "  #{company['name']}"
end

# Получить предложения по вакансиям
response = access_token.get(jquery)
jresp = JSON.parse(response.body)
puts "\nSuggested jobs for #{myName}"

# Выполнить итеративное прохождение по каждой предложенной вакансии и отобразить название компании
jresp['jobs']['values'].each do | job |
    puts "  #{job['company']['name']} in #{job['locationDescription']}"
end

puts "\n"

Консольный сеанс в листинге 5 демонстрирует выходные данные после исполнения Ruby-скрипта, показанного в листинге 4. Эти данные являются результатом трех отдельных вызовов API-интерфейса LinkedIn в скрипте (один вызов для аутентификации, один вызов для получения ссылок на предлагаемые компании и один вызов для получения ссылок на предлагаемые вакансии).

Листинг 5. Результаты обращения Ruby-скрипта к сайту LinkedIn
$ ./lkdin.rb

Предлагаемые компании для M. Tim Jones
  Open Kernel Labs, Inc.
  Linaro
  Wind River
  DDC-I
  Linsyssoft Technologies
  Kalray
  American Megatrends
  JetHead Development
  Evidence Srl
  Aizyc Technology

Предлагаемые вакансии для M. Tim Jones
  Kozio in Greater Denver Area
  Samsung Semiconductor Inc in San Jose, CA
  Terran Systems in Sunnyvale, CA
  Magnum Semiconductor in San Francisco Bay Area
  RGB Spectrum in Alameda, CA
  Aptina in San Francisco Bay Area
  CyberCoders in San Francisco, CA
  CyberCoders in Alameda, CA
  SanDisk in Longmont, CO
  SanDisk in Longmont, CO

$

API-интерфейс LinkedIn можно использовать с любым языком, который обеспечивает поддержку протокола OAuth.


Извлечение бизнес-данных с помощью API-интерфейса Yelp

Сайт Yelp представляет функционально насыщенный интерфейс типа REST API для бизнес-поиска, который охватывает рейтинги, отзывы и географические сведения (окружение, город, геокод). API-интерфейс Yelp позволяет искать компании заданного типа (например, рестораны) и ограничивать этот поиск различными критериями, такими как географический вмещающий прямоугольник; степень близости к заданным географическим координатам; степень близости к зоне, к городу или к адресу. Ответ в формате JSON содержит большое количество информации о компаниях, соответствующих заданным критериям (включая информацию об адресах, расстояниях, рейтингах, сделках и т. д.), а также URL-адреса для информации других типов (описания бизнеса, информация в мобильных форматах и т. д.).

Как и LinkedIn, сайт Yelp использует для аутентификации протокол OAuth, поэтому для аутентификации через API-интерфейс пользователю необходимо сначала зарегистрироваться на сайте Yelp и получить набор учетных данных. После того, как ваш скрипт пройдет аутентификацию, вы сможете создать URL-запрос на основе REST. В листинге 6 я жестко запрограммировал запрос на рестораны города Боулдер (шт. Колорадо). Тело ответа преобразуется в JSON-объект, по которому осуществляется итеративное прохождение с целью выдачи желаемой информации. Обратите внимание, что я исключаю закрытые рестораны.

Листинг 6. Извлечение бизнес-данных с помощью API-интерфейса Yelp (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.1f\n", 
                business['name'], business['phone'], 
                business['review_count'], business['rating'])
    end
end

Консольный сеанс в листинге 7 показывает пример выходных данных после исполнения скрипта, показанного в листинге 6. Для простоты я отображаю только первичный набор возвращенных ресторанов, не используя такие возможности API-интерфейса, как ограничение и смещение (чтобы выполнить несколько вызовов с целью получения всего списка). В этом примере выходные данные включают название ресторана, номер телефона, количество полученных отзывов и средний рейтинг.

Листинг 7. Результаты взаимодействия Ruby-скрипта с API-интерфейсом Yelp
$ ./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

$

API-интерфейс Yelp сопровождается отличной документацией с описаниями данных, примерами, механизмами обработки ошибок и т. д. API-интерфейс Yelp весьма полезен, однако его использование ограничено посредством своего рода "дросселирования". Первоначально разработчику разрешается осуществить не более 100 вызовов API-интерфейса в день и 1000 вызовов для тестирования. Если ваше приложение удовлетворит требованиям Yelp по отображению информации, вам будет разрешено до 10000 вызовов в день (с возможностью дальнейшего увеличения).


Простое mashup-приложение для определения местоположения домена

В следующем примере осуществляется связывание двух источников с целью получения информации. Мы хотим преобразовать имя веб-домена в его обычное географическое местоположение. Ruby-скрипт в листинге 8 использует Linux-команду host и сервис OpenCrypt IP Location API Service для извлечения информации о местоположении.

Листинг 8. Извлечение информации о местоположении для веб-доменов
#!/usr/bin/env ruby
require 'net/http'

aggr = ""
key = 'your api key here'

# Получить IP-адрес для домена с помощью команды host
IO.popen("host #{ARGV[0]}") { | line |
  until line.eof?
    aggr += line.gets
  end
}

# Найти IP-адрес в ответе от команды host
pattern = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/
if m = pattern.match(aggr)
    uri = "http://api.opencrypt.com/ip/?IP=#{m[0]}&key=#{key}"
    resp = Net::HTTP.get_response(URI.parse(uri))
    puts resp.body
end

В листинге 8 сначала с помощью доступной локально команды host осуществляется преобразование доменного имени в IP-адрес (сама команда host использует внутренний API-интерфейс для преобразования доменного имени в IP-адрес посредством разрешения DNS-имени). Для отыскания IP-адреса в выходных данных команды host используется простое регулярное выражение (и метод match). После получения IP-адреса он передается в сервис OpenCrypt IP Location API Service с целью извлечения геолокационной информации общего характера. API-интерфейс OpenCrypt разрешает своему пользователю совершить до 50000 бесплатных вызовов.

Вызов API-интерфейса OpenCrypt весьма прост: сформированный пользователем URL-адрес содержит как сам IP-адрес, местоположение которого этот пользователь хочет определить, так и ключ, предоставленный ему в процессе регистрации на сайте OpenCrypt. Тело HTTP-ответа состоит из IP-адреса, кода страны и названия страны.

Консольный сеанс в листинге 9 демонстрирует выходные данные для двух примеров доменных имен.

Листинг 9. Использование простого скрипта для определения местоположения домена
$ ./where.rb www.baynet.ne.jp
IP=111.68.239.125
CC=JP
CN=Japan
$ ./where.rb www.pravda.ru
IP=212.76.137.2
CC=RU
CN=Russian Federation
$

Сервис Google API Discovery

Бесспорным чемпионом по количеству API-интерфейсов для Интернета является компания Google. Google имеет так много API-интерфейсов, что предлагает специальный API-интерфейс для обнаружения этих интерфейсов. Сервис Google API Discovery Service позволяет получить перечень доступных API-интерфейсов от Google и извлечь метаданные об этих интерфейсах. Взаимодействие с большинством API-интерфейсов Google требует аутентификации, однако доступ к интерфейсу Google API Discovery можно получить по защищенному SSL-соединению. По этой причине в листинге 10 используется Ruby-класс https для создания соединения с защищенным портом. Заданный URL специфицирует запрос типа REST, а ответ представляется в формате JSON. Мы выполняем итеративное прохождение по ответу и выдаем небольшую порцию данных для предпочтительных API-интерфейсов.

Листинг 10. Получение перечня API-интерфейсов Google с помощью сервиса Google API Discovery (gdir.rb)
#!/usr/bin/ruby
require 'rubygems'
require 'net/https'
require 'json'

url = 'https://www.googleapis.com/discovery/v1/apis'

uri = URI.parse(url)

# Установить соединение с сервисом Google API Service
http = Net::HTTP.new( uri.host, 443 )
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

# Подключиться к сервису
req = Net::HTTP::Get.new(uri.request_uri)
resp = http.request(req)

# Получить JSON-представление
jresp = JSON.parse(resp.body)

# Выполнить итеративное прохождение по перечню API-интерфейсов
jresp['items'].each do | item |
  if item['preferred'] == true
    name = item['name']
    title = item['title']
    link = item['discoveryLink']
    printf("%-17s %-34s %-20s\n", name, title, link)
  end
end

Консольный сеанс в листинге 11 демонстрирует выходные данные после исполнения скрипта, показанного в листинге 10.

Листинг 11. Использование Ruby-скрипта для взаимодействия с простым сервисом каталогов Google
$ ./gdir.rb
adexchangebuyer   Ad Exchange Buyer API              ./apis/adexchangebuyer/v1.1/rest
adsense           AdSense Management API             ./apis/adsense/v1.1/rest
adsensehost       AdSense Host API                   ./apis/adsensehost/v4.1/rest
analytics         Google Analytics API               ./apis/analytics/v3/rest
androidpublisher  Google Play Android Developer API  ./apis/androidpublisher/v1/rest
audit             Enterprise Audit API               ./apis/audit/v1/rest
bigquery          BigQuery API                       ./apis/bigquery/v2/rest
blogger           Blogger API                        ./apis/blogger/v3/rest
books             Books API                          ./apis/books/v1/rest
calendar          Calendar API                       ./apis/calendar/v3/rest
compute           Compute Engine API                 ./apis/compute/v1beta12/rest
coordinate        Google Maps Coordinate API         ./apis/coordinate/v1/rest
customsearch      CustomSearch API                   ./apis/customsearch/v1/rest
dfareporting      DFA Reporting API                  ./apis/dfareporting/v1/rest
discovery         APIs Discovery Service             ./apis/discovery/v1/rest
drive             Drive API                          ./apis/drive/v2/rest
...
storage           Cloud Storage API                  ./apis/storage/v1beta1/rest
taskqueue         TaskQueue API                      ./apis/taskqueue/v1beta2/rest
tasks             Tasks API                          ./apis/tasks/v1/rest
translate         Translate API                      ./apis/translate/v2/rest
urlshortener      URL Shortener API                  ./apis/urlshortener/v1/rest
webfonts          Google Web Fonts Developer API     ./apis/webfonts/v1/rest
youtube           YouTube API                        ./apis/youtube/v3alpha/rest
youtubeAnalytics  YouTube Analytics API              ./apis/youtubeAnalytics/v1/rest
$

Выходные данные в листинге 11 содержат имена API-интерфейсов, их заголовки и URL-маршруты для доступа к каждому из этих интерфейсов.


Заключение

Приведенные в этой статье примеры иллюстрируют мощные возможности общедоступных API-интерфейсов в сфере извлечения информации из Интернета. Эти API-интерфейсы обеспечивают целенаправленный доступ к конкретной информации — в отличие от таких технологий, как веб-скрейпинг и веб-пауки. Интернет порождает "новую ценность", причем не только благодаря непосредственному использованию этих API-интерфейсов, но и за счет их комбинирования с целью предоставления новых данных все более широкому кругу пользователей.

Однако не стоит забывать, что в случае API-интерфейсов вы получаете то, за что платите. Типичной причиной неудовлетворенности являются проблемы "дросселирования". Кроме того, при создании приложения необходимо учитывать, что правила API-интерфейса могут быть изменены без предварительного уведомления. Так, сравнительно недавно сеть Twitter изменила свой API-интерфейс с целью предоставления пользователям "более единообразных возможностей". Это изменение прозвучало как смертный приговор многим сторонним приложениям, которые могли рассматриваться в качестве конкурентов типовому веб-клиенту сети Twitter.

Ресурсы

Научиться

  • Оригинал статьи: Extract information from the web with Ruby.
  • HTML Parsing with Ruby and Nokogiri: Компактное учебное руководство по использованию Nokogiri с языком Ruby; автор: Chris Umbel.
  • Программирование в стиле Representational State Transfer (REST) на Ruby (M. Тим Джонс (M. Tim Jones), developerWorks, август 2012 г.). Введение в концепции REST на примере языка Ruby.
  • Information Retrieval, Mining and Integration on the Internet: Конспекты лекций по извлечению информации из Интернета.
  • ProgrammableWeb: Полезный ресурс по API-интерфейсам и mashup-приложениям для взаимодействия с веб-сайтами.
  • CrunchBase API: Дополнительная информация об API-интерфейсе CrunchBase, который представляет данные в формате JSON на сайте CrunchBase.
  • LinkedIn API: API-интерфейс LinkedIn предоставляет множество полезных сведений при посредстве REST/JSON или JavaScript. Он позволяет искать данные профилей, контактные сведения, социальные потоки, компании и людей с использованием множества атрибутов.
  • LinkedIn authentication: Подробная информацию об использовании протокола OAuth на сайте LinkedIn для аутентификации пользователей, желающих получить доступ к API-интерфейсу.
  • Yelp API: Этот сайт позволяет своим посетителям в реальном времени и с использованием разнообразных поисковых методов получать информацию о компаниях, включая информацию о бизнесе, рейтинги, отзывы, сведения о сделках и т. д.
  • OpenCrypt IP Location API Service: Сервис для преобразования IP-адреса в географическое местоположение.
  • Google API Discovery service: Сервис для получения перечня доступных API-интерфейсов Google и для извлечения метаданных об этих интерфейсах, включая API-методы и параметры для каждого метода.

Получить продукты и технологии

  • Nokogiri: Решение для скрейпинга на языке Ruby; поддерживает парсинг HTML-документов в форматах XML и JSON.
  • pjscrape: JavaScript-среда для веб-скрейпинга на стороне клиента.
  • Beautiful Soup: Библиотека для скрейпинга; ориентирована на использование Python в качестве скриптового языка.
  • Оцените продукты IBM наиболее удобным для вас способом. Загрузите ознакомительные версии программных продуктов, воспользуйтесь их онлайновыми пробными версиями, примените продукты в облачной среде или обратитесь к ресурсу SOA Sandbox для изучения эффективной реализации решений на основе сервис-ориентированной архитектуры.

Обсудить

  • Присоединяйтесь к сообществу My developerWorks community. Связывайтесь с другими пользователями developerWorks и знакомьтесь с ориентированными на разработчиков форумами, блогами, группами и вики-ресурсами.

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Web-архитектура
ArticleID=972122
ArticleTitle=Извлечение информация из Интернета при использовании языка Ruby
publish-date=05222014