no-image

google翻訳の翻訳結果を取得する【bs4 VS find_elements】

soup.select()とfind_elementsではどっちがはやいのか?

前回の記事で「Google翻訳で翻訳された文章をとってくる【python, PhantomJS】」というのを書いた。結果的にはphantomjs+seleniumを使って翻訳結果をとってくるものとなった。しかしその時にきになったのが時間である。あとでなんとなくtimeモジュールというのがあったのでプログラムの実行時間を測ってみた。

soup.select()ってなに?

select()メソッドはbs4.BeautifulSoup()関数で取得したオブジェクトにたいして使用できるメソッド(関数)です。

find_elementsなに?

find_elementsとはseleniumを使用してhtmlの要素を取得するときに使用するプログラムの構文です。

html要素を取得するふたつの方法

上記のとおり、html要素を取得するには二つの方法がります

  1. seleniumを使用する
  2. requestした結果をbs4.BeautifulSoup()関数にわたして使用する

このうちseleniumのPhantomJSというヘッドレスブラウザを使いました。

翻訳結果をとってくる時間を計測したら10秒以上かかってしまいました。これでは普通にブラウザを開いて入力したときとあまりかわらないのでは?と思ってしまいました。ただしヘッドレスブラウザの利点はながら作業ができることではないかと思います。それはそれとして、requestsで本当に取得できないのだろうか↓。

requests.get()で該当urlをひっぱってみました。

実際にBeautifulSoup()にわたして結果をみてみると、まずそこに翻訳結果がなかった。残念ながらrequestsは使えないということになります。これは他にやり方があるのかもしれないが、僕の腕ではどうにもなりませんでした。

一応requestsを使ったサンプルコード

import pyperclip, requests, bs4, pprint

res = requests.get('https://translate.google.co.jp/?hl=ja#en/ja/' + pyperclip.paste())
res.raise_for_status() 
soup = bs4.BeautifulSoup(res.text)
print(soup)

他の方法

  • selenium+bs4
  • selenium標準のwebdriverを使用する(geckodriver)- find_elements

selenium webdrverとしてはphantomJSを使うのが前提になります。phantomJSだとうまく要素をとってこれるからです。しかもブラウザが目でみえなくて邪魔にならないからです。問題はBeautifulSoup()にもわたせるし、find_elementsにもhtmlを渡せるということです。それでこの二つの方法でどちらが実行が早いのか試してみました。

結論から話しますとselenium標準のfind_elementsでやったほうがはやかったです。(考えてみれば当たり前かもしれません)なぜかというと、bs4を使う場合は余計にモジュールをimportしなければならないからです。本当はrequestsでやりたいけども、できないので、selenium+phantomJSで攻めていくしかなさそうです。