「ココナラで副業を始めたいけど、どんなサービスが人気で、どれくらいの価格帯なのかサッと把握したい…」 「新しいスキルを身につけたけれど、市場のニーズや競合の状況が分からない…」
そんな悩みを抱えていませんか?スキルマーケット「ココナラ」には多種多様なサービスが溢れており、手作業で情報を収集・分析するのは大変な労力と時間がかかります。
この記事では、Pythonの強力なスクレイピング技術(SeleniumとBeautifulSoup)を駆使して、ココナラに掲載されているサービス情報を自動的に抽出し、効率的に分析する方法をステップバイステップで徹底解説します。副業戦略の立案、市場調査、人気テーマの把握など、あなたの目的達成を力強くサポートします。
この記事を読めば、以下のことができるようになります。
- PythonとSeleniumを使ったWebスクレイピングの基本手順の理解
- ココナラのサービス情報(サービス名、評価、価格など)を自動で収集する方法
- 収集したデータをCSVファイルに保存し、 дальнейшему分析に活用する準備
初心者の方でも安心して取り組めるよう、環境構築から具体的なコード、実践的なポイントまで丁寧に説明しますので、ぜひ最後までご覧ください。
(※スクレイピングの基礎知識や倫理的な注意点について、より詳しく知りたい方は、こちらの「プログラミング完全ガイド:基礎からスクレイピング&API活用までのまとめ」も合わせてご参照ください。)
ココナラとは? – 日本最大級のスキルマーケット
[ココナラ公式サイトへのリンク(例:ココナラ)]
ココナラは、個人が持つスキルや知識、経験をサービスとしてオンラインで提供・購入できる日本最大級のマーケットプレイスです。デザイン、翻訳、プログラミング、Webサイト制作、動画編集、占い、悩み相談など、幅広いカテゴリのサービスが出品されています。
- スキルを売りたい人: 得意なことを活かして副業を始めたり、ビジネスを拡大したりする場として。
- スキルを買いたい人: 専門的なサポートや個人のニーズに合ったサービスを手軽に見つけて依頼できる場として。
初心者からプロフェッショナルまで多くの人が集い、日々活発な取引が行われているため、市場のトレンドやニーズを把握するための情報源としても非常に価値があります。
今回使用する技術とライブラリ
本記事でココナラの情報をスクレイピングするために使用する主な技術は以下の通りです。
- Python: プログラミング言語。シンプルで強力なライブラリが豊富。
- Selenium: Webブラウザの操作を自動化するためのライブラリ。JavaScriptで動的に生成されるコンテンツの取得に有効。
- BeautifulSoup: HTMLやXMLファイルからデータを抽出するためのライブラリ。取得したHTMLを解析しやすくする。
- webdriver-manager: ChromeDriverなど、ブラウザドライバのバージョン管理と自動インストールを簡略化するライブラリ。
これらのライブラリをインストールするには、お使いのターミナルやコマンドプロンプトで以下のコマンドを実行してください。
Bash
1 2 |
pip install selenium beautifulsoup4 webdriver-manager |
【ポイント】SeleniumのChromeDriver自動設定で環境構築を劇的に簡単に! 通常、SeleniumでChromeブラウザを操作するには、お使いのChromeのバージョンに合ったChromeDriverを手動でダウンロードし、そのパスを指定する必要がありました。これはバージョン管理が煩雑で、初心者にとっては一つのハードルでした。 しかし、webdriver-manager
を利用すれば、ChromeDriverを自動的に検出し、必要であればダウンロード・設定を行ってくれます。これにより、環境設定の手間が大幅に削減され、常に適切なバージョンのドライバで開発を進めることができます。
セレクタの調べ方 – スクレイピングのキモ
スクレイピングでは、Webページ上の特定の情報(例:サービス名、価格、検索ボックス)がHTML内のどこにあるのかをプログラムに伝えるために、「セレクタ」というものを使用します。ここでは、Google Chromeのデベロッパーツールを使った基本的なセレクタの調べ方を紹介します。
- 対象のWebページを開く: スクレイピングしたいWebページ(今回はココナラのサービス一覧ページなど)をChromeで開きます。
- 検証ツール(デベロッパーツール)を開く: 情報が欲しい要素(例:特定のサービス名)の上で右クリックし、メニューから「検証」を選択します。すると、画面の右側または下部にデベロッパーツールが表示されます。(ショートカットキー:WindowsならF12、MacならCommand + Option + I)
- 要素を選択する: デベロッパーツール左上の矢印アイコン(要素の選択モード)をクリックし、ページ上で目的の要素をクリックします。すると、該当するHTMLタグがデベロッパーツール内でハイライトされます。
- セレクタをコピーする: ハイライトされたHTMLタグの上で右クリックし、「コピー」 > 「CSSセレクターをコピー」 (Copy > Copy selector) を選択します。これで、その要素を指し示すCSSセレクタがクリップボードにコピーされます。
具体例: 例えば、ココナラの検索ボックスが以下のようなHTMLだったとします。
HTML
1 2 |
<input type="search" autocomplete="off" placeholder="キーワードで検索" class="input_search_box_class_example"> |
この場合、コピーされるCSSセレクタは input.input_search_box_class_example
のようになるでしょう。このセレクタを使って、Seleniumで検索ボックスを指定できます。
実践!ココナラスクレイピング手順
それでは、実際にPythonコードを書きながら、ココナラのサービス情報をスクレイピングしていきましょう。
1. 必要なライブラリのインポートとChromeDriverの設定
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import time import csv # ChromeDriverを自動的にダウンロード・管理し、ブラウザを起動 # webdriver_managerが適切なバージョンのChromeDriverを自動でインストール・セットアップします。 try: driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) print("ChromeDriverのセットアップが完了しました。") except Exception as e: print(f"ChromeDriverのセットアップ中にエラーが発生しました: {e}") # ドライバのセットアップに失敗した場合は、ここで処理を中断するなどの対応が必要 exit() |
【ポイント】 ChromeDriverManager().install()
を Service
オブジェクトに渡すことで、ChromeDriverの自動管理とSeleniumへのセットアップが行われます。手動でのパス指定やバージョン管理の煩わしさから解放されます。
2. ココナラのページにアクセスし、キーワードで検索 今回は例として「データ分析」というキーワードで検索します。
Python
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 |
# ココナラのトップページURL COCONALA_TOP_URL = "https://coconala.com/" # 実際のURLを確認してください try: driver.get(COCONALA_TOP_URL) print(f"{COCONALA_TOP_URL} にアクセスしました。") # ページの重要な要素が読み込まれるまで適切に待機 wait = WebDriverWait(driver, 20) # 最大20秒待機 # 検索ボックスのCSSセレクタ (※実際のセレクタに置き換えてください) SEARCH_BOX_SELECTOR = 'input.input' # これは記事作成時の仮のセレクタです。必ずご自身で確認してください。 # 検索ボタンのCSSセレクタ (※実際のセレクタに置き換えてください) SEARCH_BUTTON_SELECTOR = 'button.button.d-searchInput_searchButton' # これも仮のセレクタです。 # 検索ボックスが表示されるまで待機し、キーワードを入力 search_box = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, SEARCH_BOX_SELECTOR))) search_keyword = "データ分析" search_box.send_keys(search_keyword) print(f"検索ボックスに「{search_keyword}」と入力しました。") # 検索ボタンをクリック search_button = driver.find_element(By.CSS_SELECTOR, SEARCH_BUTTON_SELECTOR) search_button.click() print("検索ボタンをクリックしました。") # 検索結果ページの読み込み待機 (固定時間ではなく、特定の要素が表示されるまで待つのが理想) # 例: 検索結果の最初のアイテムが表示されるまで待機 # RESULTS_CONTAINER_SELECTOR = 'div.search-results-area' # 仮のセレクタ # wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, RESULTS_CONTAINER_SELECTOR))) time.sleep(5) # ここでは簡易的に固定時間待機(実際の運用では上記のような動的待機を推奨) print("検索結果ページに遷移しました(待機時間後)。") except Exception as e: print(f"ページアクセスまたは検索実行中にエラー: {e}") driver.quit() exit() |
【ポイント】
WebDriverWait
を使うことで、ページ要素が利用可能になるまで待機し、スクリプトの安定性を高めます。time.sleep()
による固定時間の待機は、通信環境やサイトの応答速度によって失敗することがあるため、本番運用では特定の要素の出現を待つ動的な待機方法(例:EC.visibility_of_element_located
など)に置き換えることを強く推奨します。- CSSセレクタはWebサイトの構造変更に伴い変わりやすいため、実行前に必ずご自身で最新のものを確認・更新してください。
3. サービス情報のスクレイピング(複数ページ対応) 検索結果は複数ページにわたることが一般的です。ここでは、次のページへ遷移しながら情報を収集します。
Python
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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
service_data = [] page_number = 1 MAX_PAGES_TO_SCRAPE = 5 # スクレイピングする最大ページ数を設定(サーバー負荷軽減のため) print("\nサービス情報のスクレイピングを開始します...") while page_number <= MAX_PAGES_TO_SCRAPE: try: print(f"\n--- ページ {page_number} のデータをスクレイピング中 ---") # ページのHTMLを取得してBeautifulSoupでパース # driver.page_source で現在のブラウザに表示されているHTMLを取得 html = driver.page_source soup = BeautifulSoup(html, 'html.parser') # ★★★ サービス情報を抽出する際の重要な注意点 ★★★ # 以下のセレクタはあくまで「例」であり、実際のココナラのHTML構造とは異なります。 # 必ずご自身でChromeの検証ツール等を使い、正確なセレクタを特定してください。 # # 一般的なアプローチ: # 1. 個々のサービス情報を囲む親要素(例:div.service-item-block)を見つける。 # 2. その親要素のリストを取得する。 # 3. 各親要素の中で、サービス名、評価、価格などをそれぞれの子要素として見つける。 # これにより、情報がズレることなく正確に紐づけられます。 # 例:サービスごとの情報ブロックのセレクタ (※要検証・変更) SERVICE_ITEM_BLOCK_SELECTOR = 'div.c-serviceBlockItem' # 仮の包括的なサービスアイテムのセレクタ service_items = soup.select(SERVICE_ITEM_BLOCK_SELECTOR) if not service_items: print("サービスアイテムが見つかりませんでした。セレクタを確認してください。") break for item in service_items: try: # タイトルのセレクタ (※item内で検索, 要検証・変更) title_element = item.select_one('h3.c-serviceBlockItemContent_name') # 仮 service_title = title_element.get_text(strip=True) if title_element else "N/A" # 評価のセレクタ (※item内で検索, 要検証・変更) rating_element = item.select_one('span.c-serviceBlockItemContentPriceRating_score') # 仮 service_rating = rating_element.get_text(strip=True) if rating_element else "N/A" # 価格のセレクタ (※item内で検索, 要検証・変更) # prices = soup.find_all('strong') のような広すぎる指定は避けること! price_element = item.select_one('strong.price-value-selector') # 仮の、価格専用のセレクタ if price_element: service_price = price_element.get_text(strip=True).replace(',', '') + "円" # 例: "10,000" -> "10000円" else: service_price = "N/A" service_data.append([service_title, service_rating, service_price]) print(f" 取得: {service_title[:30]}... | {service_rating} | {service_price}") except Exception as e: print(f" 個別サービス情報抽出時にエラー: {e}") print(f"ページ {page_number} から {len(service_items)} 件の情報を処理しました。") # 次のページへの遷移処理 # 次のページボタンのセレクタ (※要検証・変更) NEXT_PAGE_BUTTON_SELECTOR = 'a.pagination-next' # 仮 try: next_button = driver.find_element(By.CSS_SELECTOR, NEXT_PAGE_BUTTON_SELECTOR) # ボタンがクリック可能になるまで待機するなどの工夫も有効 # wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, NEXT_PAGE_BUTTON_SELECTOR))) driver.execute_script("arguments[0].scrollIntoView(true);", next_button) # ボタンが画面内に入るようにスクロール time.sleep(1) # スクロール後の安定待機 next_button.click() page_number += 1 print("次のページへ遷移しました。") time.sleep(5) # 次のページの読み込み待機 (動的待機推奨) except: print("\n次のページボタンが見つからないか、クリックできませんでした。スクレイピングを終了します。") break except Exception as e: print(f"ページ {page_number} の処理中に予期せぬエラー: {e}") break # ループを抜ける print("\nスクレイピング処理が完了しました。") |
【最重要ポイント:データの抽出ロジック】
- 上記コード内の
SERVICE_ITEM_BLOCK_SELECTOR
や、その中のtitle_element
,rating_element
,price_element
のセレクタはあくまで構造を示すための仮のものです。 prices = soup.find_all('strong')
のような広すぎるセレクタ指定は、意図しないデータを取得したり、データの対応関係がズレる原因となるため絶対に避けてください。- 必ず、ご自身で実際のココナラのHTMLを確認し、各サービス情報を一意に特定できる、より精密なCSSセレクタを見つけて置き換える必要があります。サービスごとのコンテナ要素を見つけ、その中で各情報(タイトル、評価、価格)を探すアプローチが堅牢です。
4. 取得したデータをCSVファイルに保存 最後に、収集した情報をCSVファイルに出力し、ExcelやPythonのpandasなどで分析できるようにします。
Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
if service_data: csv_file_path = 'coconala_services_data.csv' try: with open(csv_file_path, 'w', newline='', encoding='utf-8-sig') as csvfile: writer = csv.writer(csvfile) # ヘッダー行を書き込み writer.writerow(['サービス名', '評価スコア', '価格']) # データ行を書き込み writer.writerows(service_data) print(f"\n収集した全 {len(service_data)} 件のデータを {csv_file_path} に保存しました。") except Exception as e: print(f"\nCSVファイルへの保存中にエラーが発生しました: {e}") else: print("\n収集できたデータがありませんでした。CSVファイルは作成されません。") # 最終処理:ブラウザを閉じる if 'driver' in locals() and driver is not None: driver.quit() print("ブラウザを終了しました。") |
【ポイント】
encoding='utf-8-sig'
を指定することで、Excelで開いた際の日本語の文字化けを防ぎます。driver.quit()
でスクレイピング終了後にブラウザを閉じることを忘れないようにしましょう。
スクレイピング時のエラー処理と注意点
Webスクレイピングは外部サイトの構造に依存するため、いくつかの一般的な問題に遭遇する可能性があります。
- 要素が見つからない (NoSuchElementException):
- 原因: WebサイトのHTML構造が変更された、セレクタが間違っている、要素がまだ読み込まれていない。
- 対策: セレクタを再確認・修正する。
WebDriverWait
を使って要素が表示されるまで待つ。
- ページ遷移エラー/タイムアウト:
- 原因: ネットワークの問題、サイトの応答が遅い、次ページが存在しない。
- 対策:
try-except
ブロックで適切にエラーを捕捉し、処理を継続または終了する。待機時間を調整する。
- IPアドレスブロック/CAPTCHA認証:
- 原因: 短時間に大量のリクエストを送信したことによるアクセス制限。
- 対策: リクエスト間に適切な待機時間(
time.sleep()
)を設ける。一度にアクセスするページ数を制限する。連続アクセスを避け、時間を分散する。(注: CAPTCHAの自動突破は推奨されません)
- 利用規約の遵守:
- 最重要: スクレイピングを行う前に、対象サイトの利用規約(
robots.txt
も含む)を必ず確認し、許可されている範囲で、サーバーに過度な負荷をかけないよう配慮して実施してください。商用利用や再配布が禁止されているデータの取り扱いには特に注意が必要です。
- 最重要: スクレイピングを行う前に、対象サイトの利用規約(
まとめと次のステップ
この記事では、PythonのSeleniumとBeautifulSoupライブラリを使い、ココナラに掲載されているサービス情報を自動で収集・保存するための基本的な手順と実践的なコード例、そして重要な注意点を解説しました。
今回学んだこと:
webdriver-manager
によるChromeDriverの簡単なセットアップ方法- Seleniumでのブラウザ操作(ページアクセス、検索、クリック)
- BeautifulSoupでのHTML解析とデータ抽出(ただし、正しいセレクタの特定が鍵!)
- 複数ページにまたがるデータの収集とCSV保存
- スクレイピングにおける一般的な注意点とエラー対処の考え方
次のステップとして:
- セレクタの特定: ご自身でココナラの実際のページ構造を確認し、記事中の仮のセレクタを正確なものに置き換えてみましょう。これが最も重要な実践ステップです。
- データ分析: 収集したCSVデータをpandasライブラリなどで読み込み、価格帯の分布、評価と価格の関係、人気キーワードの傾向などを分析してみましょう。
- 機能拡張: 特定のカテゴリのみを対象にする、出品者の情報を追加で取得するなど、ご自身の目的に合わせてスクリプトを拡張してみてください。
スクレイピングは強力な技術ですが、常に倫理的な配慮と対象サイトへの敬意を持って活用することが大切です。この記事が、あなたの副業リサーチやスキル向上のための一助となれば幸いです。
ぜひ、この記事を参考にココナラのデータ分析を始めて、新たな発見やインスピレーションを得てください!
Pythonってどんな物?
プログラミングってどんな物?という方はこちらの記事を参考にしてみてください!!
関連記事
また、プログラミングに興味はあるけどどうやって勉強していいのかわからないという方はプログラミングを視覚的に理解できる講座を作っていますのでこちらを参考にしてみてください!
Udemyというプラットホームを使用して作成した講座です。
初心者向けに作った講座となっております。以下から講座の確認ができるので見てみてください

プログラミング学習を進めているけれど、まだ副収入につなげられていない…そんなあなたへ!今こそ、学んだスキルを活かして副業に挑戦する絶好のチャンスです。プログラミングだけでなく、自分のスキルや商品をネットで販売する『ネットショップ』を開設してみませんか?
ネットショップを持つことで、自分の知識やスキルをより多くの人に届け、副収入を得ることが可能です。学んできたプログラミングを活かして、ショップのカスタマイズや運営も自由自在に行えますし、もし商品作成が難しい場合でも、デジタル商品やサービス提供など、いろんな選択肢があります。
このステップで一歩踏み出せば、今学んでいることが副収入に直結し、自分の時間をより有効に使うことができるはずです!一緒にネットショップを開設し、副業の第一歩を踏み出しましょう!
タイトルテキスト