69454


# 目的

↓のURLに表示される全ての一覧ページの求人詳細URLを取得したい。  
（ただし、求人の数は変動する。今回は291件）  
<https://next.rikunabi.com/eigyo/lst_jb0101020000/>

# 期待する結果

[code]

    [https://next.rikunabi.com/company/cmi2566412298/nx1_rq0016317040/?fr=cp_s00700&list_disp_no=1&leadtc=n_ichiran_cst_n5_ttl, 
    https://next.rikunabi.com/company/cmi1886534023/nx1_rq0016914472/?fr=cp_s00700&list_disp_no=2&leadtc=n_ichiran_cst_n5_ttl,
    https://next.rikunabi.com/company/cmi3761586187/nx1_rq0019382037/?fr=cp_s00700&list_disp_no=3&leadtc=n_ichiran_cst_n5_ttl,
    ....n件分]
    
[/code]

# 書いたコード

[code]

    import requests
    import pandas as pd
    from lxml import html
    from selenium import webdriver
    import time
    import re
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-dev-shm-usage')
    driver = webdriver.Chrome('chromedriver',options=options)
    
    #サイトのベースとなるURLを変数に入れる。
    rikunabi_base_url = 'https://next.rikunabi.com/eigyo/lst_jb0101020000/crn'
    page_count = 1
    offer_employment_url_li = []
    
    
    while True:
        rikunabi_employment_list_url = rikunabi_base_url + str(page_count) + '.html'
        driver.get(rikunabi_employment_list_url)
    
        #50件分の求人詳細URLを取得し、リストに入れる。
        offer_employment_url_li_object = driver.find_elements_by_css_selector('.rnn-textLl a')
        for offer_employment_url in offer_employment_url_li_object:
            offer_employment_url = offer_employment_url.get_attribute('href')
            offer_employment_url_li.append(offer_employment_url)
    
        #『次へ』ボタンから次のページURLを取得、なければ終了
        next_page = driver.find_element_by_css_selector('body > div.rnn-wrapper.js-rnnWrapper > div > div > div.rnn-row.rnn-row--gutter-xm > div.rnn-col-9.rnn-group.rnn-group--xm.js-resultSearch.rnn-col-offset-3 > div.rnn-group.rnn-group--xm > div.rnn-group.rnn-group--xs > div > ul > li.rnn-pagination__next > a')
        next_page_url = next_page.get_attribute('href')
        if next_page_url:
            page_count += 50
            continue
        break
    
    print(offer_employment_url_li)
    
[/code]

# 結果

[code]

    ---------------------------------------------------------------------------
    NoSuchElementException                    Traceback (most recent call last)
    <ipython-input-36-0892f82cfce7> in <module>
         27 
         28     #『次へ』ボタンから次のページURLを取得、なければ終了
    ---> 29     next_page = driver.find_element_by_css_selector('body > div.rnn-wrapper.js-rnnWrapper > div > div > div.rnn-row.rnn-row--gutter-xm > div.rnn-col-9.rnn-group.rnn-group--xm.js-resultSearch.rnn-col-offset-3 > div.rnn-group.rnn-group--xm > div.rnn-group.rnn-group--xs > div > ul > li.rnn-pagination__next > a')
         30     next_page_url = next_page.get_attribute('href')
         31     if next_page_url:
    
    〜〜略〜〜
    
    NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"body > div.rnn-wrapper.js-rnnWrapper > div > div > div.rnn-row.rnn-row--gutter-xm > div.rnn-col-9.rnn-group.rnn-group--xm.js-resultSearch.rnn-col-offset-3 > div.rnn-group.rnn-group--xm > div.rnn-group.rnn-group--xs > div > ul > li.rnn-pagination__next > a"}
      (Session info: headless chrome=84.0.4147.105)
    
[/code]

計6ページ291件のURL取得後、7ページ目のURL取得の時にbreakさせたいのですが、  
セレクターが取得できないエラーが出てしまいます。  
全URL取得後にbreakできれば方法は問いません。

どうぞよろしくお願いします。


CC BY-SA 4.0
2020-08-11T07:43:55.320
69449
2020-08-11T12:11:01.567
2020-08-11T12:11:01.567
39734
39734
question
python python3 selenium selenium-webdriver
Seleniumを使ったスクレイピングで、最後のページが終了したらbreakさせたい。


「セレクターが取得できないエラーが出てしまいます。」ということなので、それを基に`try: except:`で判定して終了させれば良いでしょう。  
以下のような感じで出来ると思います。

[code]

    #『次へ』ボタンから次のページURLを取得、なければ終了
    try:
        next_page = driver.find_element_by_css_selector(...)  ## 長いので省略
        next_page_url = next_page.get_attribute('href')
    except:
        next_page_url = ''
    
    if next_page_url:
    
[/code]


CC BY-SA 4.0
2020-08-11T08:12:34.130
69454
2020-08-11T08:12:34.130
26370
69449
answer