前回の記事では、Pythonを使ったスクレイピングの基本をChatGPTと一緒に学びました。
前回記事、【プログラミング】ChatGPTで学ぶ!Pythonスクレイピング入門
初めてのスクレイピング体験で、Webページからデータを抽出するプロセスを理解できたと思います。しかし、実際のプロジェクトでは、単一ページのデータ取得だけでなく、複数ページにわたるデータ収集や特定の情報を効率的に抽出するスキルが求められます。今回は、こうした実用的なスキルに焦点を当て、より具体的なスクレイピングのプロジェクトに取り組んでいきます。スクレイピングの基礎を固め、次のステップへと進む準備はできていますか?これから、データ収集の効率を飛躍的に高める方法を一緒に学んでいきましょう。
Pythonの始め方についてはこちらの記事を参考にしてみてください!!
参考記事
ブログ内のコードはコピーして使用できます
スクレイピングって何?
スクレイピングとは、ウェブサイトから自動的に情報を集める技術のことです。たとえば、あるウェブサイトにたくさんのデータが載っているときに、そのデータを一つ一つ手でコピーするのは大変ですよね。スクレイピングを使えば、プログラムがその作業を自動で行ってくれるので、時間を節約できるんです。Pythonというプログラミング言語を使って、こうしたデータを簡単に集めることができます。
関連記事
スクレイピングの注意点
必ずチェックしてください
スクレイピングを行う際には、技術的な側面だけでなく、倫理的・法的な側面にも十分な注意を払う必要があります。以下に、スクレイピングを行う際の主な注意点をまとめました。
1. 利用規約と法令を確認する
- 利用規約の遵守: ウェブサイトには利用規約が設けられていることが多く、スクレイピングが明示的に禁止されている場合があります。必ず利用規約を確認し、スクレイピングが許可されているかどうかを確認しましょう。
- 法令の遵守: スクレイピングが違法行為とみなされるケースもあります。特に、データの著作権やプライバシーに関する法令を遵守することが重要です。
2. robots.txtの確認
- robots.txt: ウェブサイトのルートディレクトリには「robots.txt」というファイルが設置されていることがあり、これはクローラーがアクセスして良いページや禁止されているページを指定するためのファイルです。スクレイピングを行う前に、このファイルを確認して、クローラーがアクセスを許可されているページのみを対象にするようにしましょう。
3. 過剰なリクエストを避ける
- サーバーへの負荷: 過剰にリクエストを送信すると、対象サイトのサーバーに過度な負荷をかけてしまう可能性があります。リクエストの間隔を空ける(スリープタイムを設ける)、少量のデータを定期的に取得するなど、相手のサーバーに負荷をかけないように注意しましょう。
- リクエストのペース: 一度に大量のリクエストを送ると、サーバーからIPブロックされることがあります。これを防ぐため、リクエストのペースを制御し、一定間隔を保つようにしましょう。
4. APIの利用を検討する
- 公式APIの利用: 多くのウェブサイトでは、スクレイピングの代わりにAPIを提供しています。APIを利用することで、データをより安定的かつ合法的に取得することができます。APIが提供されている場合は、まずAPIの利用を検討しましょう。
5. 個人情報や機密情報の扱い
- プライバシーの尊重: スクレイピングによって取得したデータに個人情報が含まれている場合、個人情報保護法などの規制に従う必要があります。個人情報や機密情報を扱う際は、特に慎重に対応しましょう。
スクレイピングおすすめサイト
ステップ5: 特定のデータの抽出
目標
https://books.toscrape.com/
のウェブページから、特定の要素(例: 書籍のタイトルや価格)を抽出する方法を学びます。
手順
- ページ内の特定の要素を見つける:
BeautifulSoup
を使って、特定のタグやクラス名、IDを持つ要素を見つけます。
- データの抽出:
- 抽出したい要素からテキストや属性(例えば、リンクのURL)を取り出します。
例: https://books.toscrape.com/
から書籍のタイトルと価格を取得
以下のコードを使用して、このサイトから書籍のタイトルと価格を抽出してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import requests from bs4 import BeautifulSoup # スクレイピング対象のURL url = 'https://books.toscrape.com/' # ウェブページを取得 response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 書籍のタイトルと価格を含む要素を全て取得 data_items = soup.find_all('article', class_='product_pod') # データアイテムが正しく取得されているか確認 if data_items: print("データアイテムが見つかりました。") else: print("データアイテムが見つかりませんでした。クラス名やタグを確認してください。") # 書籍のタイトルと価格を表示 for item in data_items: title = item.h3.a['title'] price = item.find('p', class_='price_color').get_text(strip=True) print(f"タイトル: {title}") print(f"価格: {price}") print('-' * 40) |
関連記事
出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
データアイテムが見つかりました。 タイトル: A Light in the Attic 価格: £51.77 ---------------------------------------- タイトル: Tipping the Velvet 価格: £53.74 ---------------------------------------- タイトル: Soumission 価格: £50.10 ---------------------------------------- タイトル: Sharp Objects 価格: £47.82 ---------------------------------------- タイトル: Sapiens: A Brief History of Humankind 価格: £54.23 ---------------------------------------- タイトル: The Requiem Red 価格: £22.65 ---------------------------------------- タイトル: The Dirty Little Secrets of Getting Your Dream Job 価格: £33.34 ---------------------------------------- タイトル: The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull 価格: £17.93 ・・・・ |
スクレイピングで、本のタイトルと価格の部分だけを丁寧に出力をしてくれました。
では、次は複数ページのデータ収集をやっていきます。
ステップ6: 複数ページのデータ収集
目標
複数ページにまたがるデータを自動的に収集する方法を学びます。
手順
- 次ページのリンクを取得:
- 現在のページから次のページのリンクを見つけます。
- ループを使って複数ページを巡回:
- 複数のページを巡回して、データを収集します。
例: https://books.toscrape.com/
のすべてのページから書籍のデータを収集
以下のコードを使用して、複数ページにわたる書籍のデータを収集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import requests from bs4 import BeautifulSoup # ベースURL(次のページへのリンクを追加して使用) base_url = 'https://books.toscrape.com/catalogue/page-{}.html' # ページ番号の初期値 page_number = 1 while True: # 現在のページのURLを作成 url = base_url.format(page_number) # ウェブページを取得 response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 書籍情報がない場合、ループを終了 data_items = soup.find_all('article', class_='product_pod') if not data_items: break # 各ページの書籍のタイトルと価格を表示 for item in data_items: title = item.h3.a['title'] price = item.find('p', class_='price_color').get_text(strip=True) print(f"タイトル: {title}, 価格: {price}") # 次のページへ進む page_number += 1 |
関連記事
出力
1 2 3 4 5 6 7 8 9 10 11 12 |
タイトル: A Light in the Attic, 価格: £51.77 タイトル: Tipping the Velvet, 価格: £53.74 タイトル: Soumission, 価格: £50.10 タイトル: Sharp Objects, 価格: £47.82 タイトル: Sapiens: A Brief History of Humankind, 価格: £54.23 タイトル: The Requiem Red, 価格: £22.65 タイトル: The Dirty Little Secrets of Getting Your Dream Job, 価格: £33.34 タイトル: The Coming Woman: A Novel Based on the Life of the Infamous Feminist, Victoria Woodhull, 価格: £17.93 タイトル: The Boys in the Boat: Nine Americans and Their Epic Quest for Gold at the 1936 Berlin Olympics, 価格: £22.60 タイトル: The Black Maria, 価格: £52.15 ・・・ |
出力結果が長くて、少し終わるのか不安になりましたが、無事に終わってくれました😊
次は出力したデータの保存をやっていきます。
ステップ7: データの保存
目標
収集したデータをCSVファイルに保存する方法を学びます。
手順
- データを収集:
- これまで学んだ手法でデータを収集します。
- CSVファイルにデータを保存:
- Pythonの
csv
モジュールを使って、収集したデータをCSVファイルに書き込みます。
- Pythonの
例: 書籍データをCSVファイルに保存
以下のコードは、https://books.toscrape.com/
から収集した書籍のタイトルと価格をCSVファイルに保存する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import requests from bs4 import BeautifulSoup import csv # ベースURL(次のページへのリンクを追加して使用) base_url = 'https://books.toscrape.com/catalogue/page-{}.html' # 保存するCSVファイルの名前 csv_file = 'books.csv' # ページ番号の初期値 page_number = 1 # CSVファイルを開き、ヘッダーを書き込む with open(csv_file, 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['タイトル', '価格']) while True: # 現在のページのURLを作成 url = base_url.format(page_number) # ウェブページを取得 response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 書籍情報がない場合、ループを終了 data_items = soup.find_all('article', class_='product_pod') if not data_items: break # 各ページの書籍のタイトルと価格をCSVファイルに書き込む for item in data_items: title = item.h3.a['title'] price = item.find('p', class_='price_color').get_text(strip=True) writer.writerow([title, price]) # 次のページへ進む page_number += 1 print(f"データが {csv_file} に保存されました。") |
出力
1 |
データが books.csv に保存されました。 |
実際に出力されたデータ画像
このように、出力されたデータを整理してCSV化することで分析等に活用できるデータとなってきます。
実際にスクレイピングを行ってみて、わかったことはWEBから指定したデータを収集できることは凄く強力なスキルなんだなと感じました。
ステップ8: データのフィルタリングと分析
目標
保存されたCSVファイルからデータを読み込み、特定の条件に基づいてデータをフィルタリングし、簡単な分析を行います。
手順
- CSVファイルからデータを読み込む:
- Pythonの
csv
モジュールを使って、保存されたデータをCSVファイルから読み込みます。
- Pythonの
- データのフィルタリング:
- 価格が特定の値以上の書籍のみを抽出します。
- データの分析:
- フィルタリングした書籍の平均価格を計算したり、特定の条件に合致する書籍の数を集計します。
具体的なコード例
以下のコードでは、前のステップで保存したbooks.csv
ファイルからデータを読み込み、フィルタリングと分析を行います。
データの読み込みとフィルタリング
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import csv # 保存されたCSVファイルの名前 csv_file = 'books.csv' # CSVファイルを読み込み、データをリストに格納 books = [] with open(csv_file, newline='', encoding='utf-8') as file: reader = csv.DictReader(file) for row in reader: # タイトルと価格をリストに追加(価格はfloat型に変換) books.append({'title': row['タイトル'], 'price': float(row['価格'].replace('£', ''))}) # 価格の£記号を除去してfloatに変換 # 価格の£記号を除去してfloatに変換 # 価格が£20以上の書籍をフィルタリング filtered_books = [book for book in books if book['price'] >= 20] # フィルタリング結果の表示 for book in filtered_books: print(f"タイトル: {book['title']}, 価格: £{book['price']}") |
データの分析
1 2 3 4 5 6 7 8 9 |
# フィルタリングした書籍の平均価格を計算 if filtered_books: avg_price = sum(book['price'] for book in filtered_books) / len(filtered_books) print(f"価格が£20以上の書籍の平均価格: £{avg_price:.2f}") else: print("価格が£20以上の書籍はありませんでした。") # フィルタリングされた書籍の数を表示 print(f"価格が£20以上の書籍の数: {len(filtered_books)}冊") |
出力
1 2 3 4 5 6 7 |
・・・ タイトル: Alice in Wonderland (Alice's Adventures in Wonderland #1), 価格: £55.53 タイトル: Ajin: Demi-Human, Volume 1 (Ajin: Demi-Human #1), 価格: £57.06 タイトル: 1st to Die (Women's Murder Club #1), 価格: £53.98 タイトル: 1,000 Places to See Before You Die, 価格: £26.08 価格が£20以上の書籍の平均価格: £40.01 価格が£20以上の書籍の数: 804冊 |
ここのように出力したファイルの読み込みとフィルタリング、分析まで行ってくれます。
まとめ
今回は実践的な取り組みとして、スクレイピングの練習サイトを活用し、実際にデータの取得を行ってみました。初めての試みでしたが、必要なデータのみを正確に抽出するプロセスを体験することで、スクレイピングの有用性やその奥深さに気づくことができました。特に、無駄な情報を除き、自分に必要なデータだけを効率的に収集できる点は、今後のデータ分析や活用において大きなメリットとなることを実感しています。
次のステップとしては、APIを活用したスクレイピングにも挑戦し、さらに高度なデータ取得技術を身につけたいと考えています。APIを利用することで、より多様なデータにアクセスできるだけでなく、リアルタイムの情報を取り込むことも可能になります。このような技術を身につけることで、データ収集の幅が一層広がり、さまざまなプロジェクトに応用できるようになるでしょう。
これからも、学んだ知識や技術を活かしながら、より深いデータ活用を目指していきたいと思います。
Pythonを学びたい方はこちらの記事を参考にしてみてください
関連記事
プログラミング学習を進めているけれど、まだ副収入につなげられていない…そんなあなたへ!今こそ、学んだスキルを活かして副業に挑戦する絶好のチャンスです。プログラミングだけでなく、自分のスキルや商品をネットで販売する『ネットショップ』を開設してみませんか?
ネットショップを持つことで、自分の知識やスキルをより多くの人に届け、副収入を得ることが可能です。学んできたプログラミングを活かして、ショップのカスタマイズや運営も自由自在に行えますし、もし商品作成が難しい場合でも、デジタル商品やサービス提供など、いろんな選択肢があります。
このステップで一歩踏み出せば、今学んでいることが副収入に直結し、自分の時間をより有効に使うことができるはずです!一緒にネットショップを開設し、副業の第一歩を踏み出しましょう!
タイトルテキスト
プログラミングを学びたいけど、どこから始めたらいいのか分からない、自分に合っているか不安…そんな悩みを持っている方におすすめしたいのが、 無料相談 サービスです!
この無料相談では、あなたの現状や目標に合わせて、最適な学習プランを一緒に考えてくれます。どんなスキルが必要なのか、どうやって学習を進めると効果的かを具体的にアドバイスしてもらえるので、無駄なく効率的にスタートを切ることができます。
さらに、プログラミング学習には同じ目標を持つ 仲間 がいること、そして頼りになる メンター の存在がとても大きな支えになります。独学ではどうしてもつまずきやすい部分も、メンターがあなたの成長に合わせて親身にサポートしてくれるので、安心して学びを進められます。
まずは 無料相談 で、あなたに合ったプランを見つけて、スキルアップへの第一歩を踏み出してみませんか?今なら、迷っている方でも気軽に相談できるチャンスです!
次回の記事はこちらから
関連記事