SlideShare una empresa de Scribd logo
1 de 17
Descargar para leer sin conexión
HTTPリクエストと
WEBクローリングについて
2019/01/16
大手町.rb #13
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
1自己紹介
Tomoya Kawanishi a.k.a. @cuzic
エネチェンジ株式会社 チーフエンジニア
電力会社、ガス会社を切り替えるなら、エネチェンジ経由で!
一般家庭も!法人も!
Ruby関西の中の人
発表者として登壇くださる方、あとで声かけください。
大手町.rb の中の人
毎月 大手町.rb の開催を予定
東京駅、各線大手町駅から直結!
Ruby の初級者がメインターゲット
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
今日のテーマ
HTTPリクエストと WEBクローリング について
Ruby には HTTP クラスが標準
標準以外にもいろいろ便利な gem がある
自分で調べるのは大変
いろいろ紹介していきます
2
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
Ruby 標準ライブラリでの HTTPリクエスト
Net::HTTP
とても機能豊富なリッチな API
POST、PUT、PATCH、DELETE
コネクションの使いまわし
プロキシの利用
ベーシック認証
HTTPリクエストヘッダの設定
多くの場合ここまでの機能は不要
リダイレクトの処理とか、面倒だからあまりオススメできない
3
uri = URI('http://example.com/some_path?query=string')
body = Net::HTTP.get(uri)
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
Net::HTTP 4
uri = URI('http://example.com/some_path?query=string')
# Net::HTTP.get
body = Net::HTTP.get(uri)
# Net::HTTP.get_response
res = Net::HTTP.get_response(uri)
puts res.body if res.is_a?(Net::HTTPSuccess)
# Net::HTTP::Get
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
req = Net::HTTP::Get.new(uri)
http.request(req)
end
puts res.body if res.is_a?(Net::HTTPSuccess)
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
net/http のリダイレクト処理(ruby-doc での例) 5
def fetch(uri_str, limit = 10)
# You should choose a better exception.
raise ArgumentError, 'too many HTTP redirects' if limit == 0
response = Net::HTTP.get_response(URI(uri_str))
case response
when Net::HTTPSuccess then
response
when Net::HTTPRedirection then
location = response['location']
warn "redirected to #{location}"
fetch(location, limit - 1)
else
response.value
end
end
print fetch('http://www.ruby-lang.org')
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
6open-uri
open を使って簡単に HTTPアクセスできる
Ruby の既存メソッドの再定義機能を使った初期の好例
一般に知られるよりもはるかに高機能
ただ、GET以外(POST等)のリクエスト等はできない
カンタンな例
open("http://www.ruby-lang.org/") {|f|
f.each_line {|line| p line}
}
# open の返り値を使う例
body = open("http://www.ruby-lang.org/") {|f| f.read }
body = open("http://www.ruby-lang.org/", &:read)
# URI を使う例
uri = URI("http://www.ruby-lang.org/en/")
body = uri.read
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
open-uri はいろいろできる 7
url = "http://www.example.com/"
# プロキシの利用1
body = open(url, proxy: "http://proxy.example.com:8000/", &:read)
# プロキシの利用2
ENV["http_proxy"] = "http://proxy.example.com:8000/"
body = open(url, &:read)
# プロキシの無効化
body = open(url, proxy: nil, &:read)
# User-Agent の設定
body = open(url, "User-Agent" => "Ruby/#{RUBY_VERSION}", &:read)
# ベーシック認証
auth = ["username", "password"]
body = open(url, :http_basic_authentication => auth, &:read)
# 3秒で open-timeout, 10秒で read-timeout
body = open(url, open_timeout: 3, read_timeout: 10, &:read)
# redirect を無効化(デフォルトは有効)
body = open(url, redirect: false, &:read)
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
open-uri でプログレスバー 8
require 'open-uri'
require 'ruby-progressbar'
url = "http://www.example.com"
content_length = nil
progress_bar = nil
body = open(url, content_length_proc: ->{ |content_length|
break if content_length
progress_bar = ProgressBar.create(total: content_length)
},
progress_proc: ->{ |transferred_bytes|
if progress_bar
progress_bar.progress = transferred_bytes
else
puts "#{transferred_bytes} / Total size is unknown"
end
}, &:read
)
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
HTTPリクエストができるいろんな gem
httparty
いちばん人気?機能豊富
rest-client
これもとても人気
9
# HTTParty
require 'httparty'
url = "http://www.example.com/"
response = HTTParty.get(url)
# rest-client
require 'rest-client'
response = RestClient.get(url)
# httpclient
require 'httpclient'
response = HTTPClient.get(url)
# excon
require 'excon'
response= Excon.get(url)
# typhoeus
require "typhoeus"
response = Typhoeus.get(url)
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
それぞれ、メリットデメリットがある
お手軽さ。使い方がカンタンか
open-uri が一番お手軽でベンリ
機能の豊富さ、人気さ
HTTParty や rest-client あたりが人気で機能も豊富
特にクッキーまわりをやってくれるのは便利
スピード
typhoeus
内部で libcurl を使っている
em-synchrony/em-http
内部で IO を高速化できる API libev を使っている
エラー表示の分かりやすさ
Open3 で wget や curl を実行するとか
デバッグ出力すると、詳細なエラーがかんたんに得られる
安定しない初期実装では便利。
stub 等が利用しにくい欠点がある。
10
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
WEBクローリングができる gem
JS の処理が不要なとき
Mechanize
ログイン、cookie の処理などもやってくれる
かなり広く使われていた
Upton
rest-client と nokogiri を内部的に利用
「次のページ」のような pagenation 処理が簡単にできる
Wombat
WEBページから JSON 形式の構造化データを簡単に生成できる
DSL がキレイ
JSの処理が必要なとき
selenium-webdriver
capybara-webkit
中間者プロキシを使ってブラウザ操作の通信を保存、
加工してスクレイピングする手法もある。
この方が高速に動作し、快適なことも多い
11
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
HTTP 、クローリングに必要な知識 1/2
URI(Uniform Resource Identifier)
コンテンツ(リソース)がある場所を示す文字列
例: http://www.example.com/example/path?query=1
Ruby では標準ライブラリの uri で処理する
HTTPクライアント
サーバと HTTP リクエスト・レスポンスの通信を行う
open-uri や rest-client などが代表的
クッキー
ステートレスな HTTP でステートフルな情報を保持する機構
Ruby では各 HTTP クライアントごとに扱い方が異なる
HTML/XML Parser
HTML 文字列をパースし、XML Selector や CSS Selector で指
定したエレメントの情報を取得できるようにする
Ruby で扱うライブラリとしては nokogiri が一般的
12
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
HTTP 、クローリングに必要な知識 2/2
HTTP プロキシ
内部ネットワークから外部にアクセスするとき仲介するサーバ
国内の IPアドレス限定サービスで、プロキシが必要なこともある
ほぼすべての HTTP クライアントがプロキシの利用に対応している
Man-in-the-Middle Proxy
中間者プロキシ
下記みたいな利用ができる
Man-in-the-Middle プロキシを設定。ブラウザでそちらに向ける
ブラウザでログイン。表示したいページ等を表示する
Man-in-the-Middle プロキシで一連のブラウザ操作を保存。
保存した通信を加工。pagenation、画像・動画の保存等を自動実行
Ruby なら ritm。Python なら mitmproxy。
13
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
その他のオススメのメソッド・gem
VCR
HTTP 通信を保存して再実行できる
テストでとても便利
レスポンスが遅いサービスを開発しているとき、
リクエスト・レスポンスを高速化し、作業効率を改善できる
WebMock
HTTPリクエストを stub できる
実際にはテスト先のサーバと通信しないようにできる
VCR gem でも内部的に使われている
Object#to_query
ActiveSupport にある。特に Hash#to_query がベンリ
14
{name: 'David', nationality: 'Danish'}.to_query
# => "name=David&nationality=Danish"
大手町.rb #13 「HTTPリクエスト・WEBクローラについて」
まとめ
HTTP リクエストを行うことはとても多いです。
マイクロサービスアーキテクチャで外部システムを利用する場合
WEBクローラを作成している場合
HTTPリクエストをしたい場合
単純に open-uri を使うのが案外オススメです。
案外高機能です。
遅いことが問題になって初めてほかの方法を検討しましょう
今回は全体的に発展的な話題が多い回でした。
詳細はあまり説明していないので、必要な人は
各自検索して調べてみてください。
15
ご清聴ありがとう
ございました

Más contenido relacionado

La actualidad más candente

Web技術勉強会 第26回
Web技術勉強会 第26回Web技術勉強会 第26回
Web技術勉強会 第26回龍一 田中
 
Rails と Rack と HTTP と通信の話
Rails と Rack と HTTP と通信の話Rails と Rack と HTTP と通信の話
Rails と Rack と HTTP と通信の話Progate, Inc.
 
Learn Http Requests & Responses for Test Engineer
Learn Http Requests & Responses for Test EngineerLearn Http Requests & Responses for Test Engineer
Learn Http Requests & Responses for Test EngineerTakashi Moriyama
 
websocket-survery
websocket-surverywebsocket-survery
websocket-surveryhogemaru_
 
歌舞伎座tech発表資料 RxJSの中を追う
歌舞伎座tech発表資料 RxJSの中を追う歌舞伎座tech発表資料 RxJSの中を追う
歌舞伎座tech発表資料 RxJSの中を追うwilfrem
 
C#er から見た Turbolinks 3
C#er から見た Turbolinks 3C#er から見た Turbolinks 3
C#er から見た Turbolinks 3dany1468
 
サーバーとは
サーバーとはサーバーとは
サーバーとはssuser33820e
 
Zend OPcacheの速さの秘密を探る
Zend OPcacheの速さの秘密を探るZend OPcacheの速さの秘密を探る
Zend OPcacheの速さの秘密を探るYoshio Hanawa
 
PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話Rui Hirokawa
 
PHPからJavaへ乗り換えた。そんな昔話をしよう
PHPからJavaへ乗り換えた。そんな昔話をしようPHPからJavaへ乗り換えた。そんな昔話をしよう
PHPからJavaへ乗り換えた。そんな昔話をしよう優介 黒河
 
BestGems.org -RubyGemsランキングサイトのご紹介-
BestGems.org -RubyGemsランキングサイトのご紹介-BestGems.org -RubyGemsランキングサイトのご紹介-
BestGems.org -RubyGemsランキングサイトのご紹介-Misao X
 
HttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何かHttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何かShigekiYamada
 
Simplest API Server "miq"
Simplest API Server "miq"Simplest API Server "miq"
Simplest API Server "miq"Yuki Ito
 
Tiny server
Tiny serverTiny server
Tiny serverkomem3
 
Beginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_studyBeginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_studyikeyat
 
Rawler C#用のWebスクレイピングフレームワーク
Rawler C#用のWebスクレイピングフレームワークRawler C#用のWebスクレイピングフレームワーク
Rawler C#用のWebスクレイピングフレームワークTakaichi Ito
 
カジュアルにMongo dbのbackup機能説明
カジュアルにMongo dbのbackup機能説明カジュアルにMongo dbのbackup機能説明
カジュアルにMongo dbのbackup機能説明Masakazu Matsushita
 

La actualidad más candente (19)

Web技術勉強会 第26回
Web技術勉強会 第26回Web技術勉強会 第26回
Web技術勉強会 第26回
 
Rails と Rack と HTTP と通信の話
Rails と Rack と HTTP と通信の話Rails と Rack と HTTP と通信の話
Rails と Rack と HTTP と通信の話
 
[BurpSuiteJapan]HTTP基礎入門
[BurpSuiteJapan]HTTP基礎入門[BurpSuiteJapan]HTTP基礎入門
[BurpSuiteJapan]HTTP基礎入門
 
HTTP入門
HTTP入門HTTP入門
HTTP入門
 
Learn Http Requests & Responses for Test Engineer
Learn Http Requests & Responses for Test EngineerLearn Http Requests & Responses for Test Engineer
Learn Http Requests & Responses for Test Engineer
 
websocket-survery
websocket-surverywebsocket-survery
websocket-survery
 
歌舞伎座tech発表資料 RxJSの中を追う
歌舞伎座tech発表資料 RxJSの中を追う歌舞伎座tech発表資料 RxJSの中を追う
歌舞伎座tech発表資料 RxJSの中を追う
 
C#er から見た Turbolinks 3
C#er から見た Turbolinks 3C#er から見た Turbolinks 3
C#er から見た Turbolinks 3
 
サーバーとは
サーバーとはサーバーとは
サーバーとは
 
Zend OPcacheの速さの秘密を探る
Zend OPcacheの速さの秘密を探るZend OPcacheの速さの秘密を探る
Zend OPcacheの速さの秘密を探る
 
PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話PHP 5.5ネーティブキャッシュの話
PHP 5.5ネーティブキャッシュの話
 
PHPからJavaへ乗り換えた。そんな昔話をしよう
PHPからJavaへ乗り換えた。そんな昔話をしようPHPからJavaへ乗り換えた。そんな昔話をしよう
PHPからJavaへ乗り換えた。そんな昔話をしよう
 
BestGems.org -RubyGemsランキングサイトのご紹介-
BestGems.org -RubyGemsランキングサイトのご紹介-BestGems.org -RubyGemsランキングサイトのご紹介-
BestGems.org -RubyGemsランキングサイトのご紹介-
 
HttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何かHttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何か
 
Simplest API Server "miq"
Simplest API Server "miq"Simplest API Server "miq"
Simplest API Server "miq"
 
Tiny server
Tiny serverTiny server
Tiny server
 
Beginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_studyBeginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_study
 
Rawler C#用のWebスクレイピングフレームワーク
Rawler C#用のWebスクレイピングフレームワークRawler C#用のWebスクレイピングフレームワーク
Rawler C#用のWebスクレイピングフレームワーク
 
カジュアルにMongo dbのbackup機能説明
カジュアルにMongo dbのbackup機能説明カジュアルにMongo dbのbackup機能説明
カジュアルにMongo dbのbackup機能説明
 

Similar a HTTPと Webクローリングについて

RESTとRailsスタイル
RESTとRailsスタイルRESTとRailsスタイル
RESTとRailsスタイルToru Kawamura
 
RESTful #とは RailsスタイルからRESTを学ぼう
RESTful #とは RailsスタイルからRESTを学ぼうRESTful #とは RailsスタイルからRESTを学ぼう
RESTful #とは RailsスタイルからRESTを学ぼうToru Kawamura
 
AngularJSでの非同期処理の話
AngularJSでの非同期処理の話AngularJSでの非同期処理の話
AngularJSでの非同期処理の話Yosuke Onoue
 
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Yukimitsu Izawa
 
request-specを利用していい感じにモックデータを作ってフロントエンド開発を楽にしたい!
request-specを利用していい感じにモックデータを作ってフロントエンド開発を楽にしたい! request-specを利用していい感じにモックデータを作ってフロントエンド開発を楽にしたい!
request-specを利用していい感じにモックデータを作ってフロントエンド開発を楽にしたい! Masato Noguchi
 
WTM52 あなたの作ったWEBサイト、生きてますか?
WTM52 あなたの作ったWEBサイト、生きてますか?WTM52 あなたの作ったWEBサイト、生きてますか?
WTM52 あなたの作ったWEBサイト、生きてますか?Masanori Oobayashi
 
Rust で簡易 HTTP サーバーを作ってみよう
Rust で簡易 HTTP サーバーを作ってみようRust で簡易 HTTP サーバーを作ってみよう
Rust で簡易 HTTP サーバーを作ってみようYuki Toyoda ✲
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) Akihiro Kuwano
 
H2O - making HTTP better
H2O - making HTTP betterH2O - making HTTP better
H2O - making HTTP betterKazuho Oku
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Koji SHIMADA
 
ネットワーク超入門
ネットワーク超入門ネットワーク超入門
ネットワーク超入門xyzplus_net
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話Takuto Wada
 
about Thrift
about Thriftabout Thrift
about ThriftNaoya Ito
 

Similar a HTTPと Webクローリングについて (20)

RESTとRailsスタイル
RESTとRailsスタイルRESTとRailsスタイル
RESTとRailsスタイル
 
RESTful #とは RailsスタイルからRESTを学ぼう
RESTful #とは RailsスタイルからRESTを学ぼうRESTful #とは RailsスタイルからRESTを学ぼう
RESTful #とは RailsスタイルからRESTを学ぼう
 
AngularJSでの非同期処理の話
AngularJSでの非同期処理の話AngularJSでの非同期処理の話
AngularJSでの非同期処理の話
 
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3Getting Started with Ruby on Rails4 + Twitter Bootstrap3
Getting Started with Ruby on Rails4 + Twitter Bootstrap3
 
request-specを利用していい感じにモックデータを作ってフロントエンド開発を楽にしたい!
request-specを利用していい感じにモックデータを作ってフロントエンド開発を楽にしたい! request-specを利用していい感じにモックデータを作ってフロントエンド開発を楽にしたい!
request-specを利用していい感じにモックデータを作ってフロントエンド開発を楽にしたい!
 
WTM52 あなたの作ったWEBサイト、生きてますか?
WTM52 あなたの作ったWEBサイト、生きてますか?WTM52 あなたの作ったWEBサイト、生きてますか?
WTM52 あなたの作ったWEBサイト、生きてますか?
 
Rust で簡易 HTTP サーバーを作ってみよう
Rust で簡易 HTTP サーバーを作ってみようRust で簡易 HTTP サーバーを作ってみよう
Rust で簡易 HTTP サーバーを作ってみよう
 
20120525 mt websocket
20120525 mt websocket20120525 mt websocket
20120525 mt websocket
 
web server
web serverweb server
web server
 
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい) 泥臭い運用から、プログラマブルインフラ構築(に行きたい)
泥臭い運用から、プログラマブルインフラ構築(に行きたい)
 
H2O - making HTTP better
H2O - making HTTP betterH2O - making HTTP better
H2O - making HTTP better
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4
 
Webページで学ぶJavaScript2013 第7回
Webページで学ぶJavaScript2013 第7回Webページで学ぶJavaScript2013 第7回
Webページで学ぶJavaScript2013 第7回
 
Let's make your CDN with RUBY
Let's make your CDN with RUBYLet's make your CDN with RUBY
Let's make your CDN with RUBY
 
ネットワーク超入門
ネットワーク超入門ネットワーク超入門
ネットワーク超入門
 
Application Bootstrap
Application BootstrapApplication Bootstrap
Application Bootstrap
 
Thrift
ThriftThrift
Thrift
 
RESTful Webサービス
RESTful WebサービスRESTful Webサービス
RESTful Webサービス
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
about Thrift
about Thriftabout Thrift
about Thrift
 

Más de Tomoya Kawanishi

ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例Tomoya Kawanishi
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウTomoya Kawanishi
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列についてTomoya Kawanishi
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてTomoya Kawanishi
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されることTomoya Kawanishi
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現についてTomoya Kawanishi
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行についてTomoya Kawanishi
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについてTomoya Kawanishi
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことTomoya Kawanishi
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選Tomoya Kawanishi
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interfaceTomoya Kawanishi
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能についてTomoya Kawanishi
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーTomoya Kawanishi
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO についてTomoya Kawanishi
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介Tomoya Kawanishi
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてTomoya Kawanishi
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについてTomoya Kawanishi
 
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Tomoya Kawanishi
 

Más de Tomoya Kawanishi (20)

英単語の覚え方
英単語の覚え方英単語の覚え方
英単語の覚え方
 
ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウ
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列について
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構について
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されること
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現について
 
Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行について
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについて
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったこと
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
 
Rake
RakeRake
Rake
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interface
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能について
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO について
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについて
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについて
 
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
 

Último

プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 

Último (8)

プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 

HTTPと Webクローリングについて

  • 2. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 1自己紹介 Tomoya Kawanishi a.k.a. @cuzic エネチェンジ株式会社 チーフエンジニア 電力会社、ガス会社を切り替えるなら、エネチェンジ経由で! 一般家庭も!法人も! Ruby関西の中の人 発表者として登壇くださる方、あとで声かけください。 大手町.rb の中の人 毎月 大手町.rb の開催を予定 東京駅、各線大手町駅から直結! Ruby の初級者がメインターゲット
  • 3. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 今日のテーマ HTTPリクエストと WEBクローリング について Ruby には HTTP クラスが標準 標準以外にもいろいろ便利な gem がある 自分で調べるのは大変 いろいろ紹介していきます 2
  • 4. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 Ruby 標準ライブラリでの HTTPリクエスト Net::HTTP とても機能豊富なリッチな API POST、PUT、PATCH、DELETE コネクションの使いまわし プロキシの利用 ベーシック認証 HTTPリクエストヘッダの設定 多くの場合ここまでの機能は不要 リダイレクトの処理とか、面倒だからあまりオススメできない 3 uri = URI('http://example.com/some_path?query=string') body = Net::HTTP.get(uri)
  • 5. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 Net::HTTP 4 uri = URI('http://example.com/some_path?query=string') # Net::HTTP.get body = Net::HTTP.get(uri) # Net::HTTP.get_response res = Net::HTTP.get_response(uri) puts res.body if res.is_a?(Net::HTTPSuccess) # Net::HTTP::Get res = Net::HTTP.start(uri.hostname, uri.port) do |http| req = Net::HTTP::Get.new(uri) http.request(req) end puts res.body if res.is_a?(Net::HTTPSuccess)
  • 6. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 net/http のリダイレクト処理(ruby-doc での例) 5 def fetch(uri_str, limit = 10) # You should choose a better exception. raise ArgumentError, 'too many HTTP redirects' if limit == 0 response = Net::HTTP.get_response(URI(uri_str)) case response when Net::HTTPSuccess then response when Net::HTTPRedirection then location = response['location'] warn "redirected to #{location}" fetch(location, limit - 1) else response.value end end print fetch('http://www.ruby-lang.org')
  • 7. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 6open-uri open を使って簡単に HTTPアクセスできる Ruby の既存メソッドの再定義機能を使った初期の好例 一般に知られるよりもはるかに高機能 ただ、GET以外(POST等)のリクエスト等はできない カンタンな例 open("http://www.ruby-lang.org/") {|f| f.each_line {|line| p line} } # open の返り値を使う例 body = open("http://www.ruby-lang.org/") {|f| f.read } body = open("http://www.ruby-lang.org/", &:read) # URI を使う例 uri = URI("http://www.ruby-lang.org/en/") body = uri.read
  • 8. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 open-uri はいろいろできる 7 url = "http://www.example.com/" # プロキシの利用1 body = open(url, proxy: "http://proxy.example.com:8000/", &:read) # プロキシの利用2 ENV["http_proxy"] = "http://proxy.example.com:8000/" body = open(url, &:read) # プロキシの無効化 body = open(url, proxy: nil, &:read) # User-Agent の設定 body = open(url, "User-Agent" => "Ruby/#{RUBY_VERSION}", &:read) # ベーシック認証 auth = ["username", "password"] body = open(url, :http_basic_authentication => auth, &:read) # 3秒で open-timeout, 10秒で read-timeout body = open(url, open_timeout: 3, read_timeout: 10, &:read) # redirect を無効化(デフォルトは有効) body = open(url, redirect: false, &:read)
  • 9. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 open-uri でプログレスバー 8 require 'open-uri' require 'ruby-progressbar' url = "http://www.example.com" content_length = nil progress_bar = nil body = open(url, content_length_proc: ->{ |content_length| break if content_length progress_bar = ProgressBar.create(total: content_length) }, progress_proc: ->{ |transferred_bytes| if progress_bar progress_bar.progress = transferred_bytes else puts "#{transferred_bytes} / Total size is unknown" end }, &:read )
  • 10. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 HTTPリクエストができるいろんな gem httparty いちばん人気?機能豊富 rest-client これもとても人気 9 # HTTParty require 'httparty' url = "http://www.example.com/" response = HTTParty.get(url) # rest-client require 'rest-client' response = RestClient.get(url) # httpclient require 'httpclient' response = HTTPClient.get(url) # excon require 'excon' response= Excon.get(url) # typhoeus require "typhoeus" response = Typhoeus.get(url)
  • 11. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 それぞれ、メリットデメリットがある お手軽さ。使い方がカンタンか open-uri が一番お手軽でベンリ 機能の豊富さ、人気さ HTTParty や rest-client あたりが人気で機能も豊富 特にクッキーまわりをやってくれるのは便利 スピード typhoeus 内部で libcurl を使っている em-synchrony/em-http 内部で IO を高速化できる API libev を使っている エラー表示の分かりやすさ Open3 で wget や curl を実行するとか デバッグ出力すると、詳細なエラーがかんたんに得られる 安定しない初期実装では便利。 stub 等が利用しにくい欠点がある。 10
  • 12. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 WEBクローリングができる gem JS の処理が不要なとき Mechanize ログイン、cookie の処理などもやってくれる かなり広く使われていた Upton rest-client と nokogiri を内部的に利用 「次のページ」のような pagenation 処理が簡単にできる Wombat WEBページから JSON 形式の構造化データを簡単に生成できる DSL がキレイ JSの処理が必要なとき selenium-webdriver capybara-webkit 中間者プロキシを使ってブラウザ操作の通信を保存、 加工してスクレイピングする手法もある。 この方が高速に動作し、快適なことも多い 11
  • 13. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 HTTP 、クローリングに必要な知識 1/2 URI(Uniform Resource Identifier) コンテンツ(リソース)がある場所を示す文字列 例: http://www.example.com/example/path?query=1 Ruby では標準ライブラリの uri で処理する HTTPクライアント サーバと HTTP リクエスト・レスポンスの通信を行う open-uri や rest-client などが代表的 クッキー ステートレスな HTTP でステートフルな情報を保持する機構 Ruby では各 HTTP クライアントごとに扱い方が異なる HTML/XML Parser HTML 文字列をパースし、XML Selector や CSS Selector で指 定したエレメントの情報を取得できるようにする Ruby で扱うライブラリとしては nokogiri が一般的 12
  • 14. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 HTTP 、クローリングに必要な知識 2/2 HTTP プロキシ 内部ネットワークから外部にアクセスするとき仲介するサーバ 国内の IPアドレス限定サービスで、プロキシが必要なこともある ほぼすべての HTTP クライアントがプロキシの利用に対応している Man-in-the-Middle Proxy 中間者プロキシ 下記みたいな利用ができる Man-in-the-Middle プロキシを設定。ブラウザでそちらに向ける ブラウザでログイン。表示したいページ等を表示する Man-in-the-Middle プロキシで一連のブラウザ操作を保存。 保存した通信を加工。pagenation、画像・動画の保存等を自動実行 Ruby なら ritm。Python なら mitmproxy。 13
  • 15. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 その他のオススメのメソッド・gem VCR HTTP 通信を保存して再実行できる テストでとても便利 レスポンスが遅いサービスを開発しているとき、 リクエスト・レスポンスを高速化し、作業効率を改善できる WebMock HTTPリクエストを stub できる 実際にはテスト先のサーバと通信しないようにできる VCR gem でも内部的に使われている Object#to_query ActiveSupport にある。特に Hash#to_query がベンリ 14 {name: 'David', nationality: 'Danish'}.to_query # => "name=David&nationality=Danish"
  • 16. 大手町.rb #13 「HTTPリクエスト・WEBクローラについて」 まとめ HTTP リクエストを行うことはとても多いです。 マイクロサービスアーキテクチャで外部システムを利用する場合 WEBクローラを作成している場合 HTTPリクエストをしたい場合 単純に open-uri を使うのが案外オススメです。 案外高機能です。 遅いことが問題になって初めてほかの方法を検討しましょう 今回は全体的に発展的な話題が多い回でした。 詳細はあまり説明していないので、必要な人は 各自検索して調べてみてください。 15