ECサイトのスクレイピングをしてみた【requests & BeautifulSoup】
なにか実践的にやってみたい…!そう思ったので、ECサイトのスクレイピングをしてみました。この記事では、情報取得からCSV出力までの過程を載せておきます。備忘録ではありますが、だれかしらの参考になればとも思っています。
【はじめに】
今回スクレイピングをおこなったサイトは、「BUYMA」というファッション系のECサイトです。スクレイピングをするときは必ず、利用規約等を確認しましょう。
これは、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サイトまとめ」みたいなものがあればいいなと思いました。
ここまでご覧いただきありがとうございます。よろしければ、フォロー、すきをお願いします!