スポンサードリンク

英語多読用の本をレベル別に取得する(ページャーに対応する)

前回の「英語多読用の本のリストをレベル別に取得する」に引き続き、
英語多読研究会さんのデータベースから、読みやすさレベル別の書籍リストを取得する実装を行います。

検索結果が多数のページにまたがらないように、結果一覧ページの表示件数を最大の100件にしています。
また読みやすさレベルで細かく分けられるように、検索項目の読みやすさレベルを0.1刻みで上げていく方法を取ります。
他の絞り込み条件を入れると、リストから漏れてしまったりということも考えられなくもないので、
単純に読みやすさレベルを細かく刻むことでその対応とします。

前回の記事で紹介したPythonのソースをさらに書き換えます。

プログラムは以下のようになりました。

プログラムソース

# -*- 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'
title_list = []

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()
        
        get_titles(browser)

        page_no = 2

        search_word = '"JavaScript:fncPagnig('+str(page_no)+');"'
        page_source = browser.page_source
        while page_source.find(search_word) > 0:
            browser.find_element_by_xpath('//a[@href='+search_word+']').click()
            get_titles(browser)
            page_no += 1
            search_word = '"JavaScript:fncPagnig('+str(page_no)+');"'
            
    finally:
        print('END')

    return title_list

def get_titles(page_text):
    titles = page_text.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)
            title_list.append(title.text)

            
if __name__ == '__main__':
    search_web()
    print(title_list)

プログラムソースの内容

今回は、プログラムの冒頭で、以下のように空のリスト「title_list」を宣言します。

title_list = []

search_web()で英語多読研究会さんのサイトからデータの取得処理を行います。

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

で、chromedriverを立ち上げて、send_keysで検索項目を指定し、
下記のclick()で検索処理を実行するところまでは前回と同じです。

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

その後、以下でget_titles()を実行します。

get_titles(browser)

取得した書名リストをtitle_listに追加します。

title_list.append(title.text)

ここまで終わると、再びsearch_web()に戻ります。

ページャーのリンクは、以下のタグです。

<a href="JavaScript:fncPagnig(2);" style="color=blue;">2</a>

これをクリックすることで2ページ目に遷移します。

ページャーがあると、”JavaScript:fncPagnig(2);” という文字列がページソース内に存在します。
最初に page_no = 2 として、以下のようにsearch_wordという文字列を生成します。

search_word = '"JavaScript:fncPagnig('+str(page_no)+');"'

3ページ以上あることも想定して、page_no をインクリメントし、
その値で生成したsearch_wordで、ページソースを検索します。

while page_source.find(search_word) &gt; 0:

ページソース内にページャーがあった場合はwhileループ内を実行します。

まずは、以下でページャーのリンクをクリックします。

browser.find_element_by_xpath('//a[@href='+search_word+']').click()
get_titles(browser)

で検索結果ページから書名リストを取得します。

page_no += 1
search_word = '"JavaScript:fncPagnig('+str(page_no)+');"'

でpage_noをインクリメントして、その値でリンク先の文字列を生成します。

while文で、この値(次のページのリンク)が存在するかを調べ、
存在する場合は再度ループ内を実行します。

次ページが存在しない場合は、ループを抜けてプログラムを終了します。

次は、書名のリストをテキストファイルに書き出すことと、
これまで固定だった検索項目(読みやすさレベル)を動かして
それぞれの読みやすさレベルごとに書名リストのテキストファイルを
生成することを実装したいと思います。

スポンサードリンク