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

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

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

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

2717閲覧

Python3 BeautifulSoupにてAmazonのcssタグがうまく取得できない

otaku46

総合スコア3

スクレイピング

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2019/08/17 13:18

前提・実現したいこと

Pythonにてamazonマーケットプレイスの古書の価格監視を行いたいです
amazonマーケットプレイスの商品一覧URLを入力し、
入力されたURLにアクセスし、価格を取得しデータベースに格納し、
価格が下がっていたらメールにて通知するシステムを作っています

そのためにBeautihulSoupにてタグの内容を取得し、整形したあと、
データベースに渡すコードを書いているのですが、
同じコードのプログラムを実行しても価格が取得できる時とエラーが出る時があります
(エラーが出る時の方が多いです)

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

IndexError: list index out of range

該当のソースコード

Python3

1 2from bs4 import BeautifulSoup #html整形 3import requests #URL取得 4import re #正規表現 5 6def check_price(ama_url): 7 ama = requests.get(ama_url) 8     #URLにアクセス 9 ama_html = BeautifulSoup(ama.text,features="lxml") 10 select_price = ama_html.select("span.a-color-price") 11 if not select_price: 12 select_price = ama_html.select("a-color-base") 13 #価格のタグを取得…実行タイミングによって取得可否が異なるのはなぜ? 14 15 pattern = r'\d*,?\d*,?\d*\d' 16 #正規表現\d = 数字 17 #* = 直前の文字の0回以上の繰り返しとマッチ 18 #? = 直前の文字の0か1回の繰り返しとマッチ 19 #パターンの最初にrをつけることでバックスラッシュをバックスラッシュとして使えるようになる 20 regex = re.compile(pattern) 21 #検索のパターンを指定 22 23 matches = re.findall(regex, select_price[0].text) 24 #指定したパターンで検索 25 price = matches[0].replace(',','') 26 #int型で扱うために、,などをreplaceメソッドで取り除いている, 27 28 return price
### 試したこと 本のタイトルや著者名も同様に取得したいため、 "title" や ".a-section.a-spacing-mini" など、他のタグでも同様に試行しているのですが、 やはり取得できる時とできない時があります ただし、"title"で取得を試みた場合には、 実行時、取得できなければ ""と空白のリストが返ってくるのですが、 .a-section.a-spacing-mini" の場合は、 IndexError: list index out of range と、価格のサイト同様のエラーが出ます ### 補足情報(FW/ツールのバージョンなど) 環境ですが、 Python3.7.1 Mac Os Shierra(10.12.6)です

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

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

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

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

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

wintermaples

2019/08/17 13:31 編集

ソースコードをコピーして実行して、10個くらい別々のURLで試行してみましたがエラーはでませんでした。 エラーが出るURLの例をご提示いただけませんか?(check_price関数は呼んでます)
wintermaples

2019/08/17 13:47

ありがとうございます。 実行してみたのですが、特にエラーは表示されず。。。 ただ、2つめの商品ページそのものの価格を表示する時に正しくない価格が表示されていました。 原因を探してみましたが、「この商品をチェックした人はこんな商品もチェックしています」のところの商品の一番左の値段を表示してしまうこともあるようです。 まずそちらを修正されたほうがよいかと思われます。
otaku46

2019/08/17 13:52

ご回答ありがとうございます。 な、なんと。。2冊目のページで、私が今しがた実行した時は、"8184"と正しい価格が表示されていました。。 タグの取得部分をもっと吟味(タグの検討、選択肢の増設など)しようと思います。
meg_

2019/08/17 14:05

そのurlはスクレイピング禁止だと思いますが。
otaku46

2019/08/18 09:56

そうだったのですか。失礼しました。 であれば、使いませんので、python習作として作成を続けたいです。 何かエラーの原因として思い当たることがございましたら、ご教示願います。
guest

回答1

0

ベストアンサー

価格の監視をしたいのならamazonのapiを使うことをお勧めします

https://haniwaman.com/amazon-api-7/

このサイトを見てurlを作ってかえってきたxmlをパースするのが一番いいと思います

投稿2019/08/20 22:15

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

otaku46

2019/08/22 10:16

おお!ありがとうございます。 試してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問