質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1198閲覧

Webスクレイピングで対象が無い場合は次候補に移りたい

psy

総合スコア4

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/07/17 14:27

編集2022/01/12 10:55

前提・実現したいこと

PYTHONでWebスクレイピングを行う際に
対象が無い場合は次の候補に移る方法が知りたいです

プログラミングの学習を始めて1カ月程度です
Webスクレイピングを行いたいとの動機からPYTHONを選択しました

他の方が公開されていたソースコードを参考に色々弄りながら
(ソースコードの内容がすべて理解できているわけではないです)
・ブラウザ(GoogleChrome)の起動
・ログイン
・HP内の移動とデータ取得(CSV出力)をリストを利用して繰り返す

まではなんとか動く状態になったものの
目的となるページが存在しない場合に止まってしまう状態が解決できません

if elif elseを利用すればよいのだろうと思うのですが
どのように記載すればよいかご教示いただければ助かります

質問の仕方など不十分な点があれば
それらについても教えていただければと思います

発生している問題・エラーメッセージ

止まる箇所①(検索ボタンを押した先に該当ページが無い場合)のエラー DevTools listening on ws://127.0.0.1:12787/devtools/browser/017c4221-d8b9-4b81-9987-3def05eee8b0 1302 Traceback (most recent call last): File "sample.py", line 41, in scraping meigara_name = root.cssselect('#meigaraHeaderMeigaraName')[0].text_content().strip() IndexError: list index out of range During handling of the above exception, another exception occurred: Traceback (most recent call last): File "sample.py", line 71, in <module> main() File "sample.py", line 30, in main scraping(browser,line.rstrip()) File "sample.py", line 67, in scraping print(traceback.format_exc(sys.exc_info()[2])) File "C:\Python\lib\traceback.py", line 163, in format_exc return "".join(format_exception(*sys.exc_info(), limit=limit, chain=chain)) File "C:\Python\lib\traceback.py", line 117, in format_exception type(value), value, tb, limit=limit).format(chain=chain)) File "C:\Python\lib\traceback.py", line 497, in __init__ capture_locals=capture_locals) File "C:\Python\lib\traceback.py", line 332, in extract if limit >= 0: TypeError: '>=' not supported between instances of 'traceback' and 'int' 止まる箇所②(ボタンがクリックできない場合)のエラー DevTools listening on ws://127.0.0.1:12410/devtools/browser/94524637-85ee-4c7e-a0c6-0cc2f1c12ad3 1305 Traceback (most recent call last): File "sample.py", line 43, in scraping browser.find_element_by_css_selector('#quarterInfoLink').click() File "C:\Python\lib\selenium\webdriver\remote\webelement.py", line 80, in click self._execute(Command.CLICK_ELEMENT) File "C:\Python\lib\selenium\webdriver\remote\webelement.py", line 628, in _execute return self._parent.execute(command, params) File "C:\Python\lib\selenium\webdriver\remote\webdriver.py", line 312, in execute self.error_handler.check_response(response) File "C:\Python\lib\selenium\webdriver\remote\errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: unknown error: Element <a id="quarterInfoLink" href="#" class="btn is-disabled">...</a> is not clickable at point (382, 252). Other element would receive the click: <li class="item">...</li> (Session info: chrome=67.0.3396.99) (Driver info: chromedriver=2.35.528161 (5b82f2d2aae0ca24b877009200ced9065a772e73),platform=Windows NT 10.0.16299 x86_64) During handling of the above exception, another exception occurred: Traceback (most recent call last): File "sample.py", line 71, in <module> main() File "sample.py", line 30, in main scraping(browser,line.rstrip()) File "sample.py", line 67, in scraping print(traceback.format_exc(sys.exc_info()[2])) File "C:\Python\lib\traceback.py", line 163, in format_exc return "".join(format_exception(*sys.exc_info(), limit=limit, chain=chain)) File "C:\Python\lib\traceback.py", line 117, in format_exception type(value), value, tb, limit=limit).format(chain=chain)) File "C:\Python\lib\traceback.py", line 497, in __init__ capture_locals=capture_locals) File "C:\Python\lib\traceback.py", line 332, in extract if limit >= 0: TypeError: '>=' not supported between instances of 'traceback' and 'int'

該当のソースコード

PYTHON3

from selenium import webdriver import lxml.html import re import traceback import sys import time CHROMEDRIVER_PATH = r"C:\Python\driver\chromedriver.exe" SITE_URL='' USER_ID='' PASSWORD='' fr=open(r'C:\Python\Program\code.txt') fw=open(r'C:\Python\Program\data.txt','w') def main(): browser = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH) browser.set_window_size(1300,1300) browser.get(SITE_URL) uid = browser.find_element_by_id('j_username') password = browser.find_element_by_id('j_password') uid.send_keys(USER_ID) password.send_keys(PASSWORD) browser.find_element_by_name('LoginForm').click() fw.write('A,B,C,D,E,F,G,H,I,J,K,L,M,N\n') for line in fr.readlines(): scraping(browser,line.rstrip()) fr.close() fw.close() def scraping(browser,code): browser.find_element_by_id('kabuMenu').click() input_code = browser.find_element_by_id('searchKey') input_code.send_keys(code) browser.find_element_by_id('meigaraSearchButton').click() try: root = lxml.html.fromstring(browser.page_source) meigara_name = root.cssselect('#meigaraHeaderMeigaraName')[0].text_content().strip() price = root.cssselect('#meigaraHeaderCurrenPrice')[0].text_content().replace(',', '').strip() browser.find_element_by_css_selector('#quarterInfoLink').click() root = lxml.html.fromstring(browser.page_source) closing = root.cssselect('#fiscalTerm')[0].text_content().replace(',', '').strip() feature = root.cssselect('#tokushoku')[0].text_content().replace(',', '').strip() inspect = root.cssselect('#gyosekiMitoshi')[0].text_content().replace(',', '').strip() topics = root.cssselect('#topixComment')[0].text_content().replace(',', '').strip() fc_ratio = root.cssselect('#gaikokujinMochikabuHiritsu')[0].text_content().replace(',', '').strip() fc_ratio = re.sub(r'\<.*\>\s*', '', fc_ratio).strip() it_ratio = root.cssselect('#toshinMoshikabuHiritsu')[0].text_content().replace(',', '').strip() it_ratio = re.sub(r'\<.*\>\s*', '', it_ratio).strip() browser.find_element_by_css_selector('#quarterInfoPerformanceLink').click() root = lxml.html.fromstring(browser.page_source) jikoshihon = root.cssselect('#value_2')[0].text_content().replace(',', '').strip() jikoshihon_ratio = root.cssselect('#value_3')[0].text_content().replace(',', '').strip() rieki_jyouyo = root.cssselect('#value_5')[0].text_content().replace(',', '').strip() yurishi_husai = root.cssselect('#value_6')[0].text_content().replace(',', '').strip() eigyou_cf = re.sub(r'((\s*\d*))', '', root.cssselect('#eigyoCashFlow')[0].text_content().replace(',', '')).strip() eigyou_cf = re.sub(r'((\s*\d*))', '', eigyou_cf).strip() genkin_cf = root.cssselect('#genkin')[0].text_content().replace(',', '').strip() genkin_cf = re.sub(r'((\s*\d*))', '', genkin_cf).strip() fw.write('{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14}\n'.format(code, meigara_name, price, closing,jikoshihon, jikoshihon_ratio,rieki_jyouyo, yurishi_husai,eigyou_cf, genkin_cf, fc_ratio,it_ratio, feature, inspect,topics)) except: print(code) print(traceback.format_exc(sys.exc_info()[2])) pass if __name__ == '__main__': main()

試したこと

止まる箇所①(検索ボタンを押した先に該当ページが無い場合)
browser.find_element_by_id('meigaraSearchButton').click()
で移動したあとに'#MeigaraName'があれば下の行に
無ければ
input_code.send_keys(code)
まで戻るような記述がIF式で書ければと思って検索するも解決できないでいます

止まる箇所②(ボタンがクリックできない場合)
browser.find_element_by_css_selector('#quarterInfoLink').click()
でクリックできないと止まるようなので
クリックできるところと出来ないところの違いを見ると
出来ない: <a id="InfoLink" href="#" class="btn is-disabled">
出来る : <a id="InfoLink" href="#" class="btn">
だったので #InfoLink の Classにis-disabled がある場合は
input_code.send_keys(code)
まで戻るような記述がIF式で書ければと思って検索するも解決できないでいます

補足情報(FW/ツールのバージョンなど)

質問用にソースコードを省略していたものを全文記載しました(IP/PASS以外)

Q.seleniumを使っていたのに、途中でlxmlを使った理由は何でしょうか?

A.用途に似たソースコードの写経(動かなかったところを色々弄ってみる)をしている段階で
selenium=ブラウザを操作するもの lxml=HTMLを解析するもの 程度のイメージしかありません
ご質問の趣旨は「seleniumだけで出来るのに何故?」ということかと思いますが
私の知識が追い付いておらず申し訳ありません 

ここにより詳細な情報を記載してください。HP

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mkgrei

2018/07/17 21:45

エラーを省略せずに全文載せてください。
mkgrei

2018/07/17 21:46

seleniumを使っていたのに、途中でlxmlを使った理由は何でしょうか?
guest

回答1

0

スクレイピングツールよく使います。

デキる人は知っている!Webスクレイピング用のソフト30選

投稿2018/07/19 08:42

Yuki-Sakuraba

総合スコア163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

psy

2018/07/20 13:34

回答ありがとうございます。色々なサービスが公開されているのは判りましたが、Pythonの知識を深めたいと思っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問