WebScraping(ウェブスクレイピング)でデータ抽出してみよう

超初心者向け

今回の記事では、Pythonを使ったウェブスクレイピングの基本を説明します。
ウェブスクレイピングとは、ウェブサイトから自動的に情報を収集する技術です。
この記事では、フリーランス仕事紹介サイト「レバテックフリーランス」の案件情報を収集し、
それをエクセルファイルに保存する方法を紹介します。

ステップ1: 必要なツールの準備
まずは、Pythonでウェブスクレイピングを行うために必要なツールを準備しましょう。
今回は、requestsとBeautifulSoup、そしてcsvモジュールを使用します。
requests: ウェブページのデータを取得するためのライブラリ
BeautifulSoup: 取得したHTMLデータを解析し、必要な情報を抽出するためのライブラリ
csv: 取得したデータをCSVファイルに書き込むためのモジュール

ステップ2: ウェブページからデータを取得
次に、requestsを使用してウェブページからHTMLデータを取得します。
以下の関数process_pageでは、指定されたURLからデータを取得し、
その内容をBeautifulSoupで解析しています。

def process_page(url):
    response = requests.get(url)
    response.raise_for_status()  # エラーチェック
    soup = BeautifulSoup(response.content, 'html.parser')
    # 以下、データ抽出の処理

ステップ3: 必要な情報の抽出
このステップでは、BeautifulSoupを使ってHTMLから必要な情報を取り出します。例えば、以下のコードは案件のタイトルや月給、勤務地などを抽出しています。

for project in soup.find_all('li', class_='prjList__item'):
    title = project.find('h3', class_='prjHead__ttl').get_text().strip()
    # 他のデータも同様に抽出

ステップ4: 全ページのデータを取得
ウェブサイトには複数ページにわたって情報が存在することがあります。これを扱うために、get_next_page_url関数は次のページのURLを取得します。

def get_next_page_url(soup):
    # 次のページのURLを取得する処理

ステップ5: データをCSVファイルに保存
最後に、収集したデータをCSVファイルに保存します。これにはcsvモジュールを使用し、以下のようにデータを書き込みます。

with open('project_data.csv', mode='w', newline='', encoding='utf-8-sig') as file:
    writer = csv.writer(file)
    # データの書き込み処理

まとめ:
Pythonを使った基本的なウェブスクレイピングの流れをご紹介しました。
この技術を使えば、様々なウェブサイトから有用な情報を自動で収集することができます。
上記はコードのポイントを抜粋した説明です。
以下にコード全体を示します。
このコードを記載したpyファイルをコマンドプロンプトで走らせることで、
csvに情報を収集することができます。

# 必要なライブラリをインポート
import requests
from bs4 import BeautifulSoup
import csv

def process_page(url):
    # 指定されたURLからウェブページを取得
    response = requests.get(url)
    response.raise_for_status()  # 応答エラーがあればここで例外が発生
    soup = BeautifulSoup(response.content, 'html.parser')  # HTMLを解析
    projects = []  # プロジェクト情報を格納するリスト
        # ページ内のプロジェクトごとに情報を抽出
    for project in soup.find_all('li', class_='prjList__item'):
        # 各種情報を抽出して変数に格納
        title = project.find('h3', class_='prjHead__ttl').get_text().strip()
        # 月給、場所、契約形態などの情報も同様に抽出
        monthly_pay_element = project.find('li', class_='prjContent__summary__price')
        monthly_pay = monthly_pay_element.get_text().strip() if monthly_pay_element else 'N/A'
        location_element = project.find('li', class_='prjContent__summary__location')
        location = location_element.get_text().strip() if location_element else 'N/A'
        contract_type_element = project.find('li', class_='prjContent__summary__contract')
        contract_type = contract_type_element.get_text().strip() if contract_type_element else 'N/A'
        features = ', '.join([feature.get_text().strip() for feature in project.find_all('li', class_='prjContent__feature__item')])
        prj_table_items = project.find_all('li', class_='prjTable__item')
        dev_env = prj_table_items[0].get_text().strip().replace('開発環境\n', '') if len(prj_table_items) > 0 else 'N/A'
        required_skills = prj_table_items[1].get_text().strip().replace('求めるスキル\n', '').replace('<br>', ', ') if len(prj_table_items) > 1 else 'N/A'
        job_type = prj_table_items[2].get_text().strip().replace('募集職種\n', '') if len(prj_table_items) > 2 else 'N/A'
        # 抽出した情報をプロジェクトリストに追加
        projects.append([title, monthly_pay, location, contract_type, features, dev_env, required_skills, job_type])
    return projects, soup

def get_next_page_url(soup):
    # 次のページへのリンクがあればそのURLを返す
    next_page_element = soup.find('li', class_='pagination__list--next').find('a', rel='next')
    if next_page_element:
        next_page_url = 'https://freelance.levtech.jp' + next_page_element['href']
        return next_page_url
    return None  # 最後のページの場合

def main():
    # 初期の検索ページURL
    url = 'https://freelance.levtech.jp/project/search/?show_public_only=&keyword=&skill%5B%5D=7&sala=7'
    all_projects = [] # すべてのプロジェクト情報を格納するリスト
    # 各ページを順に処理
    while url:
        projects, soup = process_page(url)
        all_projects.extend(projects)
        url = get_next_page_url(soup)  # 次のページのURLを取得
    # 取得したデータをCSVファイルに保存
    with open('project_data.csv', mode='w', newline='', encoding='utf-8-sig') as file:
        writer = csv.writer(file)
        writer.writerow(['Title', 'Monthly Pay', 'Location', 'Contract Type', 'Features', 'Development Environment', 'Required Skills', 'Job Type'])
        writer.writerows(all_projects)  # すべてのプロジェクトデータを書き込む

if __name__ == "__main__":
    main()

 

コメント

タイトルとURLをコピーしました