質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

1回答

3321閲覧

Mechanizeを使ったスクレイピングでformがない

yamada3

総合スコア14

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2016/03/13 19:59

  • 環境

os:osx(最終的にはherokuで運用したいと考えていますが,開発環境はmacです)
ruby -v 2.2.4

  • 質問内容

http://www.jukedeck.comに対して操作を行いmp3をダウンロードしたいのですが,そのためにはログインする必要があります.

しかし以下のようにtopにログイン用のformが見当たりませんでした.(モーダルウィンドウでログイン入力表示されるのでコードはあるがformに引っかからない)

ruby

1require 'mechanize' 2REQUEST_URL = "https://www.jukedeck.com" 3agent = Mechanize.new 4login = agent.get(REQUEST_URL)

ruby

1#実行結果(linkなどが多くてややこしいのでform以外は消しています) 2{forms 3 #<Mechanize::Form {name nil} {method "GET"} {action "https://www.jukedeck.com/"} {fields} {radiobuttons} {checkboxes} {file_uploads} {buttons [button:0x3fe049a2fdb4 type: name: value: ]}> 4 #<Mechanize::Form {name nil} {method "GET"} {action "https://www.jukedeck.com/"} {fields} {radiobuttons} {checkboxes} {file_uploads} {buttons [button:0x3fe049a91140 type: name: value: ]}> 5 #<Mechanize::Form {name nil} {method "GET"} {action "https://www.jukedeck.com/"} {fields} {radiobuttons} {checkboxes} {file_uploads} {buttons [button:0x3fe049a2ab34 type: name: value: ]}>

そこでpostでログイン出来ないか試した所,以下のコードであっさりログインはすることができました.
しかしget通信ではないのでhtmlがかえってきていないためにどの様にこの状態から操作すればよいかわからず詰まってしまいました.
このアクセストークンを旨く使えば良いのだろうとは思うのですがどうのように使えば良いのかさっぱりわかりません.

ruby

1require 'yaml' 2require 'fileutils' 3require 'mechanize' 4 5REQUEST_URL = "https://www.jukedeck.com/api/user/login" 6 7# yamlからmailとpassを取得 8nic = YAML.load_file("yml/user.yml") 9# 変数設定 10mail = nic["mail"] 11password = nic["pass"] 12agent = Mechanize.new 13login = agent.post(REQUEST_URL, { 14 #current_form:"login", 15 client_id: "P20ev5wveZ60kZ2J9KHkBis6r", 16 client_secret: "z5PjRToRbRuVkEJxpBTF5lRKsQDgRd4OY1r36zO5OuPGXmxQLc", 17 username:mail, 18 password:password, 19 })
実行結果 #<Mechanize::File:0x007f8582e48158 @body="{\"message\":\"User logged in\",\"accessToken\":\"hogehogehogehogehoge\"}", @code="200", @filename="login.html", @full_path=false, @response= {"content-type"=>"application/json; charset=utf-8", "date"=>"Sun, 13 Mar 2016 19:23:16 GMT", "etag"=>"W/\"hogehogehogehogehoge\"", "x-powered-by"=>"Express", "content-length"=>"89", "connection"=>"keep-alive"}, @uri=#<URI::HTTPS https://www.jukedeck.com/api/user/login>>

そこでここからどの様にすればmp3をdlできるのか,またはrubyのスクレイピングでMechanize以外で何かいいものがありましたらご教授ください.
よろしくお願い致します.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

http://www.jukedeck.comのユーザーでないため想像です。

なので,このサイトはページをJSONのデータを取得しながらjavascriptで動的に作っているようです。

だとすると,mp3をdlするためにどのようなリクエストをしているのかは,JavaScriptを解読する必要がありそうです。それか,GET,POSTのHTTP通信をキャプチャして,それを見ながら試行錯誤してみるとか。
Webアクセスをモニタする

投稿2016/03/13 23:05

編集2016/03/13 23:07
NCC1701

総合スコア1680

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamada3

2016/03/14 02:48

>NCC1701さん お早い解答ありがとうございます 通信を見たところmp3作成リクエスト(作成してからdlするので)を見てみた所以下のようなリクエストを送れば良いことがわかりました. ``` #General Request URL:https://www.jukedeck.com/api/music/generateTrack Request Method:POST Status Code:200 OK #Request Headers Accept:*/* Accept-Encoding:gzip, deflate Accept-Language:ja,en-US;q=0.8,en;q=0.6 Authorization:Bearer hogehogehogehogehogehogehogehoge= Connection:keep-alive Content-Length:374 Content-Type:application/json Cookie: hogehogehogehogehogehogehogehoge Host:www.jukedeck.com Origin:https://www.jukedeck.com Referer:https://www.jukedeck.com/make/track-generator/essential User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36 #Request Payload view source { image: "https://s3-eu-west-1.amazonaws.com/jukedeck-static-content/genre-images/ambient/ambient_background_14.jpg" settings: { christmasify: false duration: 90 filter: "minimalist" genre: "ambient" imageUrl: "https://s3-eu-west-1.amazonaws.com/jukedeck-static-content/genre-images/ambient/ambient_background_14.jpg" instruments: [] mood: "sparse" tempo: "medium" } } ``` ここに以下のソースでpostを送ってみました ```ruby require 'yaml' require 'fileutils' require 'json' require 'mechanize' REQUEST_URL = "https://www.jukedeck.com/api/user/login" nic = YAML.load_file("yml/user.yml") user = nic["mail"] password = nic["pass"] agent = Mechanize.new login = agent.post(REQUEST_URL, { client_id: "P20ev5wveZ60kZ2J9KHkBis6r", client_secret: "z5PjRToRbRuVkEJxpBTF5lRKsQDgRd4OY1r36zO5OuPGXmxQLc", username:user, password:password, }) headers = JSON.parse(login.body) agent.request_headers["authorization"] = "Bearer " + headers["accessToken"] agent.request_headers["connection"] = "keep-alive" agent.request_headers["origin"] = "https://www.jukedeck.com" REQUEST_URL = "https://www.jukedeck.com/api/music/generateTrack" test = agent.post(REQUEST_URL,{ image: "https://s3-eu-west-1.amazonaws.com/jukedeck-static-content/genre-images/electronic/electronic_background_7.jpg", settings: { christmasify: false, duration: 300, filter: "dnb", genre: "electronic", imageUrl: "https://s3-eu-west-1.amazonaws.com/jukedeck-static-content/genre-images/electronic/electronic_background_7.jpg", instruments: [], mood: "aggressive", tempo: "medium", }, }) ``` ``` #実行結果 Mechanize::ResponseCodeError: 504 => Net::HTTPGatewayTimeOut for https://www.jukedeck.com/api/music/generateTrack -- unhandled response from /Users/kiitan/Dropbox/heroku/sinatratest/vendor/bundle/ruby/2.2.0/gems/mechanize-2.7.4/lib/mechanize/http/agent.rb:316:in `fetch' ``` Net::HTTPGatewayTimeOutが帰ってきました. ここで予測ですがCookieを使わずに通信を行っているのが悪いのだろう思いました. 同じCookieつけて最初の通信と後の通信をすれば良いのだろうと思いCookieがどの通信で取得できるか見てみたのですがレスポンスにCookieが帰ってきているものがなくどうやってCookieを取得すればよいがわかりません よろしくお願い致します.
NCC1701

2016/03/14 05:19

http://www.bmoo.net/archives/2012/03/313309.html http://www.asahi-net.or.jp/~ax2s-kmtn/ref/status.html やHTTP 504で検索するとわかりますが、504のエラーはCookieの問題ではないはずです。 begin rescueで例外処理を作ってretryしてみてください。 なお、http://www.rubydoc.info/gems/mechanizeにドキュメントがありますので、Mechanize::CookieJarIMethodsあたりでcookieを確認してください。 Mechanize::HTTP::Agentは原則として黙っててもcookieを保持しているはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問