見出し画像

ECサイトのスクレイピングをしてみた【requests & BeautifulSoup】

なにか実践的にやってみたい…!そう思ったので、ECサイトのスクレイピングをしてみました。この記事では、情報取得からCSV出力までの過程を載せておきます。備忘録ではありますが、だれかしらの参考になればとも思っています。

【はじめに】

今回スクレイピングをおこなったサイトは、「BUYMA」というファッション系のECサイトです。スクレイピングをするときは必ず、利用規約等を確認しましょう。

画像1

これは、BUYMAの利用規約の一部抜粋してきたものです。内容的には、「全ての情報はBUYMAが知的財産権として帰属し、これらの権利を侵害してはいけない」といった感じでしょうか。なので、今回CSVファイルのデータは記載しないことにします。

(もし私が誤認しているようなら教えてください…!)

【コードの全容】

それでは、まずは一通り書いたコードをお見せします。

#スクレイピングの定番
from bs4 import BeautifulSoup
import requests
import pandas as pd
#BUYMAのURL(今回は「スニーカー メンズ」で検索)
url = 'https://www.buyma.com/r/-C1002F1/%E3%82%B9%E3%83%8B%E3%83%BC%E3%82%AB%E3%83%BC/'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')

#めっちゃ絞り込みたいときの書き方→soup.find_all('タグ名', '属性名':'その属性の中で欲しい情報の変数名')
elements_name = soup.find_all('div',{'class':'product_name'})
elements_price = soup.find_all('span',{'class':'Price_Txt'})
elements_maker = soup.find_all('a',{'class':'brandname'})
#配列作成
products_name = [] 
products_price = []
products_maker = []
#データ要素を配列に入れる
#商品名
for element_name in elements_name:
   products_name.append(element_name.text)
#金額
for element_price in elements_price:
   products_price.append(element_price.text)
#メーカー
for element_maker in elements_maker:
   products_maker.append(element_maker.text)
#len()最強
print(len(products_name))
print(len(products_price))
print(len(products_maker))
#CSVファイルへ
f = pd.DataFrame()
f['商品名'] = products_name
f['金額'] = products_price
f['メーカー'] = products_maker
f.to_csv('product.csv', index = False, encoding = 'utf_8_sig')

コメントは、その下の固まりが何をしているのか、もしくは私が重要だと思ったことを書いたりしています。

この先では、順を追ってゆっくり理解を深めていきましょう。

【スクレイピングの定番】

#スクレイピングの定番
from bs4 import BeautifulSoup
import requests
import pandas as pd

スクレイピングを始めるとなったら、まず必要になるアイテムたち。
BeautifulSoup:HTMLコードの抽出に使用。頼もしい
requests:URLの取得に使用。頼もしい
pandas:CSVファイル出力に使用。頼もしい

【URL取得と抽出の準備】

#BUYMAのURL(今回は「スニーカー メンズ」で検索)
url = 'https://www.buyma.com/r/-C1002F1/%E3%82%B9%E3%83%8B%E3%83%BC%E3%82%AB%E3%83%BC/'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')

ここでは、

・「url」変数に、スクレイピングしたいサイトのURLを代入
・requests.getで、URLを読み込む
・BeautifulSoupで、コンテンツ化したデータをHTMLの形にする

以上のことをしています。ここも必須のこーどですね。

【抽出データの絞り込み】

#めっちゃ絞り込みたいときの書き方→soup.find_all('タグ名', '属性名':'その属性の中で欲しい情報の変数名')
elements_name = soup.find_all('div',{'class':'product_name'})
elements_price = soup.find_all('span',{'class':'Price_Txt'})
elements_maker = soup.find_all('a',{'class':'brandname'})

どうやってより詳細な情報を抽出できるだろうか。と調べていたら見つかりました。参考サイトはこちら。

めっちゃ抽出データを絞り込みたいときは、

soup.find_all('タグ名', '属性名':'その属性の中で欲しい情報の変数名')

これでいけました。ちょっとHTMLの知識がないと難しいかもしれません…。
ここで簡単に書いておくと、


タグ名:HTMLコードの<>←これに囲まれてる中の、一番最初の英単語
属性名:classとか、idとか


という感じですかね。これで伝わるのだろうか…?

【配列作成】

#配列作成
products_name = [] 
products_price = []
products_maker = []

複数のデータを手に入れたいので、配列は準備しました。あるとおそらく便利です。

【データを配列へ】

#データ要素を配列に入れる
#商品名
for element_name in elements_name:
   products_name.append(element_name.text)
#金額
for element_price in elements_price:
   products_price.append(element_price.text)
#メーカー
for element_maker in elements_maker:
   products_maker.append(element_maker.text)

それぞれのデータを、先ほど作った配列に入れ込んでます。配列に入れるときには、「for~in~文」を使うと便利です。これ以上に楽になる方法があればご教授ください。(自力で考えることも大事)

【len()最強説】


#len()最強
print(len(products_name))
print(len(products_price))
print(len(products_maker))

このプログラムを組んでエラーになった原因を解決してくれた「len()」くんです。今回、データを配列に格納したのですが、最初はエラーが出てきました。「データの数がすべての配列で同じじゃないよ」とのことです。実際、配列内のデータ数を数えるために使用したら、属性名を間違えていたせいで、格納されていないことが分かりました。優秀。

【CSVファイルへ】

#CSVファイルへ
f = pd.DataFrame()
f['商品名'] = products_name
f['金額'] = products_price
f['メーカー'] = products_maker
f.to_csv('product.csv', index = False, encoding = 'utf_8_sig')

最後はCSVファイルへ出力です。ここでは、pandasライブラリにある、「pd.DataFrame()」を使用することで、実現しました。ファイルを確認したら、ちゃんと情報が取得出来てました。嬉しい。

【まとめ】

というわけで今回は、実践的なことに取り組みたいと思い、ECサイトのスクレイピングをしました。利用規約等を確認しないと、違法になることもあるため注意が必要ですね…。「スクレイピングOKなWebサイトまとめ」みたいなものがあればいいなと思いました。

ここまでご覧いただきありがとうございます。よろしければ、フォロー、すきをお願いします!

この記事が気に入ったらサポートをしてみませんか?