スポンサードリンク

英語多読用の本のリストをレベル別に取得したい

英語多読研究会さんが、英語多読に使える本のデータベースを公開してくれています。
読みやすさレベルを指定して検索することができるので、
自分のレベルに合わせた本を探すのに非常に使い勝手がいいサイトになっています。

このリストから読みたい本を見つけて英語多読に役立てたいところですが、
個別に本を買っていると結構お金がかかってしまいます。

そこで洋書も多いKindle Unlimitedで対象の本があれば
月額980円で読み放題ということで、
より英語多読がやりやすくなります。

ということで、英語多読に役立てたいという目的で、
英語多読研究会さんのデータベースからレベル別に
本のリストを取得することを考えてみます。

Seleniumを使おう

レベル別に英語本のリストを取得するには、
検索画面に抽出したいレベルを指定して
検索要求を投げる必要があります。

最初はPythonスクリプトからRequestsを使って
リスト取得することを考えました。

検索項目等の指定をした上で検索要求を投げる訳ですが、
再び検索画面が表示されるだけで、なぜか検索結果画面が表示されません。
(検索画面と検索結果画面のURLが同じで、どうにも受け渡しているパラメーターによって切り替えているっぽいです)

Requestsでヘッダ情報をセットしたり、
検索画面で受け取ったクッキーを検索要求で渡すなどやってみましたが
うまくいかずRequestsでの検索要求はやめることにしました。
(ブラウザから渡しているhidden項目等を渡してみましたがことごとくダメでした)

ということでSeleniumでブラウザを操作して検索結果を取得してみます。

Seleniumを操作するプログラム

まずはプログラムソースを。

前回の記事「PythonとSeleniumでブラウザの自動操作」で作成したソースを改変します。

# -*- coding: utf-8 -*-
"""
Created on Thu Dec 22 16:32:48 2016

@author: 
"""

from selenium import webdriver

url = 'http://www.seg.co.jp/sss_review/jsp/frm_a_100.jsp'
keyword0 = '100'
keyword1 = '0.0'
keyword2 = '0.0'


def search_web():
    try:
        browser = webdriver.Chrome('./chromedriver')
        browser.get(url)
        
        search_input = browser.find_element_by_name('dt_page_in')
        search_input.send_keys(keyword0)

        search_input = browser.find_element_by_name('nm_yle')
        search_input.send_keys(keyword1)

        search_input = browser.find_element_by_name('nm_yls')
        search_input.send_keys(keyword2)
        
        browser.find_element_by_name('Submit3022233').click()
        
        #print(browser.page_source)
        titles = browser.find_elements_by_xpath('//b')
        isTitle = 0
        for title in titles:
            if isTitle == 0 and title.text == '簡易検索:':
                isTitle = 1
            elif isTitle == 1 and title.text == 'ISBN検索:':
                isTitle = 2
            elif isTitle == 1:
                print(title.text)
            #booktext = bookdata.text

        
    finally:
        print('END')


if __name__ == '__main__':
    search_web()

プログラムソースの解説

keyword0 = ‘100’で、表示件数(100件)、
keyword1 = ‘0.0’とkeyword2 = ‘0.0’で読みやすさレベルを設定しておきます。

browser = webdriver.Chrome('./chromedriver') 

で、Pythonスクリプトと同じディレクトリ内に置いたchrmedriverを読み込みます。
browser.get(url) で指定したURLを開きます。

search_input = browser.find_element_by_name('dt_page_in')
search_input.send_keys(keyword0)

で、dt_page_inにkeyword0(100)をセットします。

同様に「nm_yle」と「nm_yls」に検索項目である読みやすさレベルを指定します。

browser.find_element_by_name('Submit3022233').click()

で検索ボックスをクリックします。

検索結果ページはbrowserに入っていて、
書名は「bタグ」で囲まれているので、書名リストをfind_elements_by_xpathで取得します。

titles = browser.find_elements_by_xpath('//b')

titlesにbタグで囲まれた書名のリストが入っていますが、
それ以外のbタグで囲まれた部分もリストに入っているので、
以下で取り除きます。

isTitle = 0
for title in titles:
    if isTitle == 0 and title.text == '簡易検索:':
        isTitle = 1
    elif isTitle == 1 and title.text == 'ISBN検索:':
        isTitle = 2
    elif isTitle == 1:
        print(title.text)

ここまでで、検索を実行して表示された検索結果ページから
書名のリストを取得する(ただし最初の1ページ目のみ)ということができました。

引き続いて次回は、検索結果が複数ページに渡る場合に
画面を遷移させた上で書名リストを取得し、
これをテキストファイルに出力するということを行います。

Pythonって直観的で使いやすい言語ですね。

スポンサードリンク