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

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

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

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

Beautiful Soup

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

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

2回答

4385閲覧

スクレイピングで要素取得ができない

TOMO6181

総合スコア39

スクレイピング

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

Beautiful Soup

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

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

2クリップ

投稿2019/07/28 09:49

現在、Pythonを使ったスクレイピングで商品サイトの画像情報を取得しようとしています。
その前段階の処理として、商品画像ページへのリンクを取得しようとしており、以下のコードを作成しました。

Python

1import requests as req 2from bs4 import BeautifulSoup 3import time 4import lxml 5from selenium import webdriver 6 7def get_requests(url): 8 time.sleep(5) 9 res = req.get(url) 10 return res 11 12if __name__ == '__main__': 13 # URL取得 14 url = 'https://www.fujiya-peko.co.jp/sweets/products_list/index.html' 15 16 # サイトに接続 17 res = get_requests(url) 18 19 # ここからseleniumでボタンを押す 20 driver_path = 'C:\pythonCode\chromedriver_win32\chromedriver.exe' 21 driver = webdriver.Chrome(driver_path) 22 driver.get(url) 23 selmoreBtn = driver.find_element_by_class_name('moreInfoBtn') 24 selAtag = selmoreBtn.find_element_by_tag_name('a') 25 selAtag.click() 26 27 # 以下のクラスで、商品情報一覧を取得 28 # flexElement4 boxLink01 jsonBoxLink moreInfoBlock 29 soup = BeautifulSoup(res.text, 'lxml') 30 31 productinfo = soup.find('div', class_='moreInfoBlock') 32 33 print(productinfo['class']) 34 print(productinfo.string) 35 print(productinfo.text) 36 37 divs = productinfo.find_all('div') 38 39 print(len(divs)) 40 41 # 商品画像ページへのリンク(aタグのhref属性)を出力 42 for div1 in divs: 43 adata = div1.find('a') 44 45 if adata is not None: 46 print(adata['href'])

対象のサイトには「もっと見る」ボタンがあるため、seleniumを使用して、ボタンをクリックしたときの操作を行うようにしています。
その後で、Beautifulsoupを使用し、HTMLの情報を取得しているのですが、何故か
「productinfo = soup.find('div', class_='moreInfoBlock')」の直後のprint文で「productinfo.string」、「productinfo.text」の
出力結果がNoneになり、その後のdivsの中身も空になってしまっています。

コード上のどこに問題があるか、分かる方がおられましたら宜しくお願い致します。

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

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

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

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

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

meg_

2019/07/28 12:34 編集

soup = BeautifulSoup(res.text, 'lxml') 上記で取得した「soup」には取得したい要素が入っていますか?「もっと見る」ボタンクリック直後は未だ画像が表示されていないかもしれません。 【追記】 BeautifulSoupでの(動的なページの)取得は難しいと思いますので、Seleniumで要素を取得するのが良いと思います。
TOMO6181

2019/07/29 14:59

ご回答ありがとうございます。 res.textをprintしてみたところ、moreInfoBlock要素の子要素が <figure class="loading"><img src="/assets/img/loaging.gif" alt=""></figure> となっており、画像情報の部分がまだできていないようでした。 ただ、 res = get_requests(url) を soup = BeautifulSoup(res.text, 'lxml') の直前に持っていっても、time.sleepを入れても、同様にして <figure class="loading"> が表示されて画像部が取得できない状態です。
guest

回答2

0

ベストアンサー

JSON読み出しサンプル
https://requests-docs-ja.readthedocs.io/en/latest/user/quickstart/#json

python

1import requests 2 3r = requests.get("https://www.fujiya-peko.co.jp/sweets/json/sweets.json") 4 5data = r.json() 6 7for i in data: 8 print(i["title"], i["image"])

画像保存サンプル

python

1def download_img(url, file_name): 2 3 r = requests.get(url, stream=True) 4 5 if r.status_code == 200: 6 with open(file_name, 'wb') as fw: 7 fw.write(r.content)

投稿2019/07/30 13:13

barobaro

総合スコア1286

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

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

TOMO6181

2019/07/30 15:07

具体的なサンプルコートまで頂きありがとうございます。 JSONの読み出しと、画像保存サンプルにより、画像保存を行うことができました。
guest

0

画像ページのリンク情報を取得したいが目的だと思いますので、ここのJson情報読み取れば良いと思います。
BeautifulSoup や Selenium なしで取得できるはずです。
商品情報は後から取得しているので、Seleniumで取得する必要があるのは、質問に書いてくださっているものと同意です。

取得すると良いJson情報

https://www.fujiya-peko.co.jp/sweets/json/sweets.json

どう読み解いたか

  1. 全てを表示するボタンがある。Classは、showAllBtn
  2. JSを読み解くとshowAllBtnをクリックした時に、Ajaxで取得しているURLがsweets.json

投稿2019/07/28 14:14

hirontan

総合スコア195

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

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

TOMO6181

2019/07/29 15:06

ご回答ありがとうございます。 JSを読み解いて、商品情報を記載したJsonファイルを取得する方法もあるのですね。 前提が漏れていて申し訳ないですが、今最終的にやろうとしていることは、商品情報から画像ファイルを取得することです。その際に、1個1個の画像を右クリック→保存とやっていては時間が膨大にかかるため、それらの作業を自動化させる必要があります。 繰り返し質問になり重ね重ね申し訳ないですが、JSONファイルをスクレイピングで読み取り、画像ファイルを保存、ということはできますでしょうか?
hirontan

2019/07/29 15:22

`requests`モジュールを使って画像を取得し、`open()`・`with`によるファイル書き込みを行えば、良いと思います。 前述で述べた画像のURLさえわかっていれば、問題なく保存までできると思います。
TOMO6181

2019/07/30 15:06

ありがとうございます。 仰る通り、画像のURLにより画像を保存することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問