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

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

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

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

1566閲覧

Webスクレイピングのクラス指定方法について質問です。

Yuu412

総合スコア37

スクレイピング

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/07/18 11:04

今、Laravelでこのページに沿ってWebスクレイピングを実行しようとしています。

具体的には、amazonのデジタル1眼の売れ筋ランキングのタイトルと画像をスクレイピングするというものです。

実際に、手順通りに進めると、上手くスクレイピングすることはできたのですが、上記ページ内「データの取得方法」でカメラのタイトルを取得するときに、クラス名として「.p13n-sc-truncate」を指定していました。

そこで、実際にamazonのデジタル1眼の売れ筋ランキングで検証(画像1)を使って、商品タイトルのクラスを調べてみると、クラス名は「p13n-sc-truncate-mobile-type p13n-sc-truncate-desktop-type2 p13n-sc-truncated」となっていました。ここでは、クラスが3つあり、そのうち「p13n-sc-truncated」を指定することで、スクレイピングをしたのかな?と思ったのですが、実際にスクレイピングしたときに指定したクラス名は上記の通り「.p13n-sc-truncate」でした。つまり最後の「d」が抜けているクラス名を指定したということになります。

画像1
イメージ説明

そこで、クラス名が部分的に一致すればそのクラスを取得できるのかと思い「p13n-sc-truncat」(1文字減らした)でスクレイピングすると、商品タイトルを取得できませんでした。

次に、検証の画像1の右側にある検索画面に「p13n-sc-truncate」を入力すると、(画像1黄色の部分)には「p13n-sc-truncated」ではなく「.p13n-sc-truncate」と表記されていました。以下にその表記を記述します。

.p13n-sc-truncate, .p13n-sc-truncate-desktop-type1, .p13n-sc-truncate-desktop-type2, .p13n-sc-truncate-medium, .p13n-sc-truncate-small

結論としましては、スクレイピングの際に、正しくクラス名を指定する方法を教えていただきたいです。よろしくお願いします。

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

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

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

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

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

miyabi_takatsuk

2020/07/19 01:39

スクレイピングの練習のためにやっているのでしょうか? もしそうでなく、何かの実装で使いたいのであれば、 スクレイピングより、APIは絶対にあるので、そちらの方が、様々確実だと思うのですが・・・
Yuu412

2020/07/19 03:20

最終的には、都道府県を入力すると、大学一覧(https://passnavi.evidus.com/search_univ/list/)のページから、その都道府県に属する大学名をスクレイピングしようと考えております。 私のAPIへの理解が乏しくて申し訳ないのですが、Amazonなどの主要なサービスにはAPIがあると思うのですが、上記の目的のような場合でもAPIを使用することで実装可能でしょうか。 たしかに、スクレイピングは危険(不正アクセス?のような面で)という話も聞くので、安全な方法でできれば幸いです。
yuki84web

2020/07/19 05:37

スクレイピングでもAPIでも使い方によってはサーバーに負荷をかけてしまいますのでリクエストを送る頻度は考えないといけません。"amazon ランキング API"で調べると色々と出てくるので、それらが参考になるのではないでしょうか。
guest

回答2

0

kei0310さんもおっしゃっている様に
まずはhtmlというものにおいて、classというものがどの様な役割を果たしているのか改めて認識していただくことが良いかと思います。

抽出したい対象の要素についてですが、複数のclassが設定されていると思います。
抽出したい対象がランキング1位のものだけであるといった場合は構いませんが、抽出したい対象が「ランキング内の全ての商品」といった場合には、各要素に設定されている共通のclassを指定する必要などがあります。

例えば全ての商品画像を抽出したいということであれば
掲題のページの場合以下の様な形で<img>タグが<div>に囲まれています。

html

1<div class="a-section a-spacing-small"> 2 <img alt="FUJIFILM ミラーレス一眼カメラ X-A5レンズキット ブラウン X-A5LK-BW" src="https://images-fe.ssl-images-amazon.com/images/I/91JjiM3rWzL._AC_UL200_SR200,200_.jpg" height="200" width="200"> 3</div>

そして<div>にはa-sectiona-spacing-smallというclassが設定されていますが、調べた所ページ内ではa-sectionというclassは他の部分でも使用されているclassの様で、もしこのclassを指定したとしても他の部分の要素までも抽出されてしまいます。
もう一方のa-spacing-smallというclassはランキング内の商品画像を囲っているdivのみに使用されている共通classの様なので、これをターゲットに絞ることで画像のタグを絞り込んでいくことができます。

python

1import requests 2from bs4 import BeautifulSoup 3 4target = 'https://www.amazon.co.jp/gp/bestsellers/electronics/3946818051?ref_=Oct_BSellerC_3946818051_SAll&pf_rd_p=7019a35e-d4ad-5da4-8fdd-f9f5c8ef9428&pf_rd_s=merchandised-search-10&pf_rd_t=101&pf_rd_i=3946818051&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=61C7KYXHQFEAY80RGM67&pf_rd_r=61C7KYXHQFEAY80RGM67&pf_rd_p=7019a35e-d4ad-5da4-8fdd-f9f5c8ef9428' 5res = requests.get(target) 6soup = BeautifulSoup(res.content, 'html.parser') 7 8# htmlからa-spacing-smallクラスが設定されたdiv要素をリスト化し抽出 9div_list = soup.find_all('div', class_='a-spacing-small') 10 11for div in div_list: # imgを囲っているdiv要素を一つづつ取り出す 12 img = div.find('img') # div要素の中のimg要素を抽出 13 print(img.get('src')) # imgタグのsrcを抽出し出力 14

投稿2020/08/01 18:38

nto

総合スコア1438

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

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

0

正しくクラス名を指定する方法を教えていただきたいです。

何を正しいと判断するかわかりませんが、期待した要素がどの部分なのかまずは検証してみることです。

子セレクターを使用してみるという方法も無駄な部分はある程度なくなりますので方法のひとつです。

投稿2020/08/01 15:36

kai0310

総合スコア2070

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問