スポンサードリンク

英語多読用の本をレベル別に取得する(完成版)

これまでのまとめと残りの実装

検索を行いその結果をリスト化しテキストに保存するという一連の作業を実装します。

検索の実行はPythonでSeleniumを動作させて行います。

英語多読研究会さんのWEBページから、読みやすさレベル別に本のリストを取得するスクリプトの完成版です。

これまで、「英語多読用の本のリストをレベル別に取得する」や
英語多読用の本をレベル別に取得する(ページャーも対応)」で
実装してきたものの完成版です。

レベル別の英語多読用の本のリストをそれぞれテキストファイルに書き出すという処理です。

読みやすさレベルは、0.0から0.1刻みで10.0まであるので、
それぞれのレベルごとに本のリストを取得して、そのISBNをテキストファイルに書き出します。

今までは書名を取得していたのですが、検索結果の中にISBNが含まれていたことに気が付き、これを取得することにしました。

プログラムソース

では、プログラムソースです。

# -*- 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'
level_no = 0
isbn_list = []

def open_window():
    try:
        browser = webdriver.Chrome('./chromedriver')
    finally:
        print('END')
    return browser
        
def search_web(browser, keyword1):
    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(keyword1)
    
    browser.find_element_by_name('Submit3022233').click()
    
    return browser

def go_next_page(browser):
    isFind = True
    page_no = 1
    
    while isFind:
        get_isbns(browser)
    
        page_no += 1
        search_word = '"JavaScript:fncPagnig('+str(page_no)+');"'
        
        if browser.page_source.find(search_word) > 0:
            browser.find_element_by_xpath('//a[@href='+search_word+']').click()
        else:
            isFind = False

def get_isbns(browser):
    subjects = browser.find_elements_by_class_name('subj')
    for subject in subjects:
        if subject.text.find('●ISBN:') > 0:
            isbn = subject.text.split('●ISBN:')
            isbn = isbn[1].split('(')
            isbn_list.append(isbn[0])

def write_file(level_no):
    f = open('list'+str('%1.1f' % level_no)+'.txt', 'w')
    for isbn in isbn_list:
        f.write(isbn)
        f.write('\n')
    f.close()
    

if __name__ == '__main__':
    browser = open_window()
    while level_no < 10:
        browser = search_web(browser, str('%1.1f' % level_no))
        go_next_page(browser)
        write_file(level_no)
        level_no += 0.1
        isbn_list = []

プログラムソースの説明

ソース下部の

if __name__ == '__main__':

から各メソッドを実行していますので、ここから説明していきます。

これまではsearch_web()内で

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

を行っていたのですが、検索のたびに新しいウィンドウを立ち上げたくなかったので、
別途open_window()メソッドを定義して、1回だけこれを呼び出すことにしました。

読みやすさレベルは、0.0から10.0まで検索を続けるので、
whileループで各レベルごとに検索処理を実行します。

ループ内では、search_web()で検索処理を実行し、
検索結果をgo_next_page()に渡します。

go_next_page()では、検索結果ページごとにget_isbns()を呼び出し、
ページャーのリンクを探します。
ページャーのリンクの数だけ、リンクをクリックし、検索結果をget_isbn()に渡すことを繰り返します。

get_isbns()では、ISBNはclass名が「subj」というtdタグで囲まれているので、
find_elements_by_class_nameで「subj」を指定して中の文字列を取得します。
これで文字列はリストに入るので、この文字列でループし、
「●ISBN」という文字列がある場合だけISBNを取得し、これをリストに追加します。

ISBNをリストに追加し終わったらwrite_file()で
読みやすさレベル別にテキストファイルに保存します。

次にlevel_no(読みやすさレベル)を0.1上げて、
検索結果をセットするリストを初期化しておきます。

以上をlevel_noが10になるまで繰り返します。

注意事項

私は、非常に低スペックのパソコンで実行しているためか、
Seleniumで検索を行ってページ送りしてという動作が非常に緩慢です。
手動で検索を行ってページ送りしてというよりも動作が遅いぐらいです。

ですのでsleepを入れていませんが、
高スペックパソコン等で検索やページ送りの動作が非常に速い場合は
ループの間隔をあけるように適度にsleepを入れましょう。

スポンサードリンク