1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

スクレイピング時、iframeやjavascriptのせいで要素が取得できなかった

Posted at

スクレイピングツールはnokogiriを使います

問題

  • 検証ツールでカーソルを合わせると要素が表示されるのに、その要素を指定して取得しようとすると失敗する

僕の場合、動画をダウンロードするためurlを取得しようとしたらこの問題に陥った
この記事ではmp4ファイルを取得するのがゴールとする
その過程でもう一つの問題

  • javascriptで作られた要素が取得できない

こちらに関しては強引に解決したので、あまり参考にならないかもしれない

原因

取得したい要素がiframeタグに囲まれている
srcで指定したurlから読み込んでいるため、iframeタグ内の要素は取得できない

解決過程

iframeのsrcを取得し、そのurlを取得してその中身を取得します

doc = Nokogiri::HTML5(URI.open(url))
iframe = "https:#{doc.at_css("iframe").attr("src")}"

一旦iframeの中身を確認
index.htmlに保存

file = "./index.html"
open(file, "wb") do |file| 
  file.print open(url).read
end 

web上のブラウザでカーソルを合わせるとvideoタグが現れる。
そこにmp4のurlがあるのだが、index.htmlにはvideoタグがない
どうやらjavascriptで生成されている様子
だがscriptタグの中にそれっぽいurlを発見

<body>
 .
 .
 <script>
  .
  .
  const args = {"id":".....","src":"..mp4","text":"...

javascriptのハッシュの中に定義されている様子
javascriptの定数をrubyに渡す方法など知らないので、scriptタグの中身を取得し、正規表現で削っていく

iframe_doc = Nokogiri::HTML5(URI.open(iframe))
script = iframe_doc.at("body script").text
rough = script.match(/\"src\"\:.*\.mp4\"\,\"title\"/).to_s

mp4ファイルが複数記述されてたので、その前後も含めて切り取る
こっから正規表現によって強引に削ってurl取得

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?