pythonで自動でgoogle翻訳させる
前回の計画ではbs4とrequestsとpyperclipを使ってgoogle翻訳をとってこようと計画をねっていました。しかしながら、bs4,requestsだけではクリック操作が模倣できないのです。しかしクリック操作は必要ないことに私は気づきました。 ←現在は前回の計画記事を改修しているため打消し線にしています。
今回はPhantomJSを使ったやり方が成功したのでお届けしたいと思います。
Google翻訳の特徴を理解する。
google翻訳には翻訳ボタンなどがなくボタンをクリックしなくてもテキストエリアに貼り付けた時点で自動的に行わます。とりあえずこの特徴を理解しておくとよいです。
pythonでPhantomJSを使うにはSeleniumを使用する
PhantomJSは、JavaScriptをサポートするヘッドレス(GUIなしで動作する)Webブラウザです。主にWebページの自動化やスクレイピング、テスト自動化などの目的で使用されます。pythonでPhantomJSを使う場合はSeleniumと組み合わせてPhantomJSを利用する必要があります。
PhantomJSを使うメリット
PhantomJSなどのヘッドレスブラウザをつかうと、ブラウザが立ち上がらないので作業の邪魔にならない。
PhantomJSを使うデメリット
- 何がおきているのか目でみえない。
- 以外と動作がもっさりしている
- 見えないので精神的に恐い
PhantomJSはデメリットのほうが多い結果となりましたが、ブラウザが立ち上がらないというのはやはりちょっとこわいですね。今回紹介する方法はあくまでもPhantomJS単体ではなくpythonのseleniumモジュールでPhantomJSを使うやり方です。
Google翻訳からPhantomJSを使って翻訳したものをとってくるコード
import pyperclip
from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get("https://translate.google.co.jp/?hl=ja#en/ja/" + pyperclip.paste())
spanlist = driver.find_elements_by_tag_name("span")
for i in range(50, 60):
print(spanlist[i].text)
driver.quit()おもしろいのは5行目でpyperclip.paste()を使っているところです。こうすることによって英文をコピーしてこのプログラムを実行すれば、すぐに結果を得ることができます。もしくはsysモジュールを使って、コマンドライン引数でプログラムを実行してもおもしろいかもしれません。
問題は6,7行目です。
6行目はelements_by_tag_name(‘span’)としています。これでspan要素がリストにできます。7行目がいやらしいです。range(50, 60)としているのはその辺に翻訳されたエレメントがあるからです。少々野暮な書き方ですが、これでとれるのでこのままにしておきます。
最後にPhantomJSは意外に動作が遅いです。都度Google翻訳を開いて貼り付けても良いかもしれません。
追記: requests、bs4ではうまく要素を取得できませんでした。
import pyperclip
import requests
import bs4
import pprint
res = requests.get('https://translate.google.co.jp/?hl=ja#en/ja/' + pyperclip.paste())
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'html.parser')
elems = soup.select('span')
for i in range(len(elems)):
print(elems[i].getText())BeautifulSoupは動的なサイトの場合うまく要素が取得できません。
最後に
PhantomJSは現在(2023/07時点)でメンテナンスが停止しているため、代替えのヘッドレスブラウザとしてchromewebドライバーを使う方法が一般的となっています。
chromewebドライバーは以下のサイトからダウンロードすることができます↓
https://chromedriver.chromium.org/downloads
chromewebドライバーとseleniumを使って翻訳を自動化する方法は以下の記事に書いていますので参考にしてください↓


コメント