見出し画像

seleniumで読みたい本検索プログラムを作ったよ

前書き

こんにちは、rickyです。

今回は図書館サイトから本を検索し、その本があるかを判別するプログラムを作ったのでその解説をします。

・・・この字面だと、サイトに行って調べたら簡単じゃないかと思われた方もいらっしゃるかもしれません。

確かに数冊の本を検索する程度であればサイトで調べてしまうのが簡単でしょう。

しかし調べたい本の数が100冊、200冊とあった場合にはどうでしょう?

今回のプログラムはこうした問題に対応できるように作ってみました。

開発の経緯(ただの自分語りなので読み飛ばしてもらって大丈夫です)

エンジニアが読むべき本というのはたくさんあります。

この本がいいよと紹介しているサイトもたくさんあります。

それらの情報をまとめていくと数百冊くらいのデータが簡単に出来上がります。

どの本が本当にいいのかの区別がつかない以上、多読するしかありません。

ですが、これだけの数の本を買うための資金もありませんし、何より本を置く場所がありません。

そこで図書館で借りることを考えました。

しかし、どの本があるのかを検索して探すのは大変です。

そんな中『退屈なことはpythonに任せよう』という本の中でseleniumについて書かれた章がありました。

seleniumを使えば簡単に調べられてしかも本の数が増えても対応ができるんじゃないかと思いました。

こうしてseleniumを使って自動化処理を作る作業が始まりました。

対象読者

pythonの簡単なコード(FizzBuzz程度)は独力で書ける

pythonで自動処理をしたい

seleniumでどんなことができるのかを見てみたい

独力でpipが使え、必要なライブラリをインストールできる

なお、開発環境はUbuntuでpythonのバージョンはpython3 です。

前提知識

seleniumとは?

テスト作業を行うための自動化ツール。

利用することでブラウザを自動的に動かすことができる。

ある程度のコードが読める。(コーディングを始めて3か月以上が経過している)

本旨

最終的な成果物:図書館サイトから本のタイトルを検索し、著者名を取得する。また本が存在することがわかるようにタグをつける。

今回は書籍の情報がスプレッドシートに入っていたのでそこから情報を抽出します。対象となる図書館サイトは東工大のサイトを利用させていただいております。

まずはスプレッドシートとの接続作業です。

この作業はgoogleの設定が必要でした。

接続には対象となるurlとアクセスするためのキーが必要となります。

キーの取得方法は別のサイトを参照してください。

スプレッドシートから取り出した情報を検索窓に入力、検索していくという形になります。

今回はwebdriverをimportしています。

これはseleniumライブラリの機能の1つで、ブラウザの自動化を行うことができます。

for文の中ではfind_element_by_idでhtml内にあるidを取得しています。

今回は検索窓と検索ボタンが対象となっています。

この検索窓にsend_keysで情報を入力していきます。

正規表現を使っているのは著者名の箇所に余計な文字列が入るのを防ぐためです。

worksheet.update_cell(i,9, 'IT')の箇所がタグ付けとなります。

本来であればジャンルなどを特定したかったのですが、その情報が掲載されていなかったのでこのような形となっています。

# spreadsheet
import gspread, json, urllib.request,time
from oauth2client.service_account import ServiceAccountCredentials
from bs4 import BeautifulSoup
def spreadsheet(spread_url, spread_key):
   res = urllib.request.urlopen(spread_url)
   soup = BeautifulSoup(res, 'html.parser')
   scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
   credintials = ServiceAccountCredentials.from_json_keyfile_name('spreadTest-d67314f7f959.json', scope)
   gc = gspread.authorize(credintials)
   global worksheet
   worksheet = gc.open_by_key(spread_key).sheet1
   
   
# 東工大図書館検索
from selenium import webdriver
import re
spreadsheet("https://docs.google.com/spreadsheets/d/1dhNV5wfiWJDSywRSUVfrEGZc1Q8h-KekdbQivVDUSgo/edit#gid=1629587095",'1dhNV5wfiWJDSywRSUVfrEGZc1Q8h-KekdbQivVDUSgo')
url = 'https://topics.libra.titech.ac.jp/'
browser = webdriver.Firefox()
browser.get(url)
for i in range(80, 85):
   i = str(i)
   import_value = worksheet.acell('F' + i).value
   search_window = browser.find_element_by_id('edit-keys')
   search_window.clear()
   push_btn = browser.find_element_by_id('edit-submit')
   search_window.send_keys(import_value)
   push_btn.click()
   
   check_word = ''
   try:
       author = browser.find_element_by_class_name('authors_label')
   except:
       browser.back()
       continue
   author = author.text    
   search_signal = re.compile(r'[^<]*')
   mo = search_signal.search(author)
   print(mo.group())
   worksheet.update_cell(i,7, mo.group())
   worksheet.update_cell(i,9, 'IT')
   worksheet.update_cell(i,10, '東工大')
   
   browser.back()

後書き

いかがでしたか?

今回は知らない方のために実際に動作する様子が見れるようになっていますが、わざわざ表示せずに処理を行わせる方法もあります。

そのやり方については興味がある方は調べてみてください。

今回のこの記事でseleniumの面白さを少しでも理解していただくことができたのなら記事を書いた甲斐があります。

自動でブラウザを走って、処理を行う様子は楽しかったですし、作りたいプログラムを設計し、その通りに動くのはやっぱり面白いです。

ただ、後に似たようなアドオンがすでにあると知り、ちょっとだけショックでした・・・

まぁ、みんな考えることは同じなんだなぁと思った次第です。

Githubに上げてあるのでよかったら、cloneして使ってみてください。

これを読んでいる方のお役に立てれば幸いです。

ここまで読んでいただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?