それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

SeleniumのWebDriver(chrome)からCookieを取りだしてHTTP::CookieにしたりCurlで再利用する

Selenium のWebDriverからCookieを取り出したら

Seleniumで画像をだけを取り出して保存したり、ファイルを取り出すのは不便だよね。

だけど、直接Curlで叩くのもCookieの問題でもっと不便だよね。

そこでSeleniumCookieCurlで使える形式やNetscape形式で保存したり、RubyPythonなどの http cookieクラスに変換して保存したら楽だと思ったので作ってみた。

私はスクレイピングメインなのでChromeを使っています。

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さえなんとかすれば結構楽しい世界が広がる。

関連資料

http://takuya-1st.hatenablog.jp/entry/2013/08/15/031247