Selenium のWebDriverからCookieを取り出したら
Seleniumで画像をだけを取り出して保存したり、ファイルを取り出すのは不便だよね。
だけど、直接Curlで叩くのもCookieの問題でもっと不便だよね。
そこでSeleniumのCookieをCurlで使える形式やNetscape形式で保存したり、RubyやPythonなどの http cookieクラスに変換して保存したら楽だと思ったので作ってみた。
Selenium からCookieを取り出してファイルに保存する。
保存する形式は次の通り。
imid=HeNFSXsHS82I7KZB9xiYkQ; expires=Thu, 06-Jun-2019 17:43:13 GMT; domain=.im-apps.net; path=/;
def save_cookie_to_cookie_jar(driver) s = driver.manage.all_cookies.map{|e| [ "#{e[:name]}=#{e[:value]}" , "#{e[:secure] ? 'secure; ':'' }", (e[:expires]||Time.now).strftime('%a, %d-%b-%Y %T GMT'), "domain=#{e[:domain]}" , "path=#{e[:path]}" , ].reject{|e| e == '' }.join("; ") }.join("\n") tmp = Dir::Tmpname.make_tmpname( 'a', '.cookie_jar.txt' ) tmp = File.expand_path(tmp, Dir.pwd) open(tmp, 'w'){|f| f.puts s} return tmp end
curl で使える形式に保存してみる
## 取り出したファオルの形式は次の通り。( タブ区切り ) example.com FALSE / TRUE 0 XSRF-TOKEN ePG7sHRafqxj
def save_cookie_for_curl(driver) s= driver.manage.all_cookies.map{|e| [ e[:domain], ((e[:domain]=~/^\./)==0).to_s.upcase, (e[:expires]||Time.now).to_time.to_i , e[:path], e[:secure].to_s.upcase, e[:name], e[:value] ].join("\t") }.join("\n") tmp = Dir::Tmpname.make_tmpname( 'a', '.cookie_jar.txt' ) tmp = File.expand_path(tmp, Dir.pwd) open(tmp, 'w'){|f| f.puts s} return tmp end
cookie さえなんとかすれば
スクレイピングでHTMLからデータを抜くのに、並行処理だとか、分散処理が出来て一気に楽になる。
サーバーの負荷はたしかに気になるけど、ドメインを dig って CDN 経由ならもう気にしないことにしてる。
CDNはそう簡単に落ちないし、強い。
wkhtmltopdf
と組合せたり、 chrome --print-pdf
と組合せたり、curl と組合せたり、Mechanizeと組合せたり、Cookieさえなんとかすれば結構楽しい世界が広がる。