インターンシップの最新情報をまとめるサイトを作る
学んだこと(6/3,6/5,6/12)
1.練習用サイトからデータを取得して、Excelでそのまま開ける「CSVファイル」に自動で書き出す
-
「
import csv」 → 集めたデータをExcelで綺麗に開ける「CSVファイル」としてパソコンに書き出すための、ファイル操作の道具 -
「
import time」 → プログラムの動きを「1秒止める」など、時間をコントロールして相手のサーバーへのお行儀の良いマナー(ブレーキ)を生み出すためのタイマー -
「
import requests」 → 指定したURLのウェブサイトへ一瞬で飛んでいき、サイトの設計図(HTML)を丸ごとダウンロードしてくる通信担当の道具 -
「
from bs4 import BeautifulSoup」 → ダウンロードした複雑な設計図を綺麗に整理し、「ここだけ欲しい!」というデータを宝探しのように見つけ出す解析担当の道具 -
「
url = "https://quotes.toscrape.com/"」 → データを集めたい対象のウェブサイトの住所(URL)を、後で使い回しやすいようにしまっておく箱 -
「
headers = { "User-Agent": "..." }」 → 「プログラム(ロボット)ではなく、WindowsのChromeブラウザから見に来ましたよ」という自分のプロフィールを書き込み、サイト側からの門前払い(アクセス禁止エラー)を防ぐための身分証明書 -
「
requests.get(url, headers=headers)」 → 通信担当の道具を使い、自己紹介シート(右のheaders)を専用の受付ポケット(左のheaders=)にカチッとはめ込んでページをダウンロードし、返ってきたデータを丸ごと受け取る命令 -
「
BeautifulSoup(response.text, "html.parser")」 → 届いた呪文のような文字のカタマリ(response.text)を、HTML専用のハサミ("html.parser")を使ってタグごとにパチパチと切り分け、後から検索しやすいスープのような状態に整える処理 -
「
soup.find_all("span", class_="text")」 → 整理されたデータの中から、サイトの作者が名言グループに付けた目印(class="text")を狙い撃ちして、ページ内から1つ残らず全て見つけて引っ張り出す宝探しメソッド(※Pythonの命令と被って大混乱するのを防ぐため、お尻に _ がついている) -
「
with open("result.csv", "w", encoding="utf-8-sig", newline="") as f:」 → "result.csv" というファイルを新規上書きモード("w")で開き、Excelで開いたときの「文字化け」を防ぐ魔法の設定(encoding="utf-8-sig")と、「謎の空行バグ」を防ぐ設定(newline="")を施し、これ以降は f という短いあだ名 で呼ぶという宣言 -
「
csv.writer(f)」 → 開いたファイル(f)に対して、文字の間に自動でカンマ(,)を挟みながら綺麗にマス目に収めてくれるCSV専用の自動筆記マシーン(ペン) -
「
writer.writerow(["番号", "収集したデータ内容"])」 → 用意したペンを使い、ExcelのA列1行目・B列1行目にそれぞれ配置される「一番上の見出し(タイトル行)」をズバッと書き込む命令 -
「
for i, quote in enumerate(quotes, 1):」 → 集めた名言の段ボール箱(quotes)から、データを1個ずつ取り出す自動ベルトコンベア。その際、手前に1番から順番に番号シール(i)をペタペタ貼りながら、中身を一時的な置き場所(quote)へ流し込む繰り返し処理 -
「
quote.text」 → ベルトコンベアから流れてきたデータから、周りにベタベタくっついている邪魔なHTMLタグ(皮)を綺麗に剥ぎ取って、人間が読める純粋な「文字(テキスト)だけ」を抜き出すプロパティ -
「
writer.writerow([i, quote.text])」 → 番号シール(i)と、皮を剥いた綺麗な文字(quote.text)をペアにして、CSV専用ペンでExcelの次の行へどんどん自動で書き込んでいく処理(10回自動リピート) -
「
time.sleep(1)」 → 次の処理にいく前に「1秒間じっと待って休憩する」ことで、超高速連打による相手のサーバーのパンクや、自分のパソコンが出入り禁止になるトラブルを絶対に防ぐためのスクレイピングの鉄の掟
実際に書いたコード
import csv # ファイルを保存するための道具を追加
import time
import requests
from bs4 import BeautifulSoup
url = "https://quotes.toscrape.com/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")
quotes = soup.find_all("span", class_="text")
# --- ここから保存の処理を追加 ---
# 「result.csv」という名前のファイルを作って開く
with open("result.csv", "w", encoding="utf-8-sig", newline="") as f:
writer = csv.writer(f)
# 最初の行(ヘッダー)を書き込む
writer.writerow(["番号", "収集したデータ内容"])
# データを1つずつファイルに書き込んでいく
for i, quote in enumerate(quotes, 1):
writer.writerow([i, quote.text])
print("🎉 ファイルへの保存が完了しました!")
time.sleep(1)
2.Excel(CSV)のデータを、オシャレなWebサイトの画面に表示させる
-
「
import pandas as pd」 → 大量のアカウントデータやExcelの表(データフレーム)を、一瞬で並び替えたりキーワードで検索したりするための、データ処理専門の超強力な道具 -
「
import streamlit as st」 → 前にもカレンダーで使った、Pythonのコードから一瞬でオシャレなWebサイトの画面を組み立ててくれる魔法の大道具 -
「
st.title("...")」 → Webサイトの一番上の特等席に、看板となる一番大きくて見栄えの良い「タイトル文字」をドカンと表示させる命令 -
「
pd.read_csv("result.csv", encoding="utf-8-sig")」 → さっきスクレイピングで作ったExcel(CSV)ファイルをPandasの力で丸ごと読み込み、Pythonが高速で中身を検索できるデジタルデータ(データフレーム)に変換する命令 -
「
encoding」 → パソコンが読める「0と1の数字(数字の羅列)」と、人間が読める「文字(あ、A、漢など)」を、どんなルールで変換するかを決めた「文字の翻訳辞書」のこと。 「utf-8-sig」 はExcelとPythonのどちらでも完璧に日本語が通じる辞書 -
「
st.text_input("...")」 → 画面の中に、人間がキーボードで文字を打ち込める「検索ボックス(入力欄)」を1つ作り出し、そこで人間が打ち込んだ文字を受け取る処理 -
「
if search_query:」 → もし検索ボックスに文字が「何か1文字でも入力されていたら」という、条件分岐のスイッチ -
「
df["収集したデータ内容"].str.contains(search_query, case=False, na=False)」 → 読み込んだデータの「収集したデータ内容」の列を上から下まで見に行き、検索ボックスに入力された文字が含まれている行を自動で見つけ出す宝探し命令(※case=False は英語の大文字・小文字を区別せず、どちらでもヒットさせるための優しい設定。na=False はもしデータの中に「中身が空っぽのマス(空白の行)」があっても、プログラムをエラーで止めずに「そこにはキーワードは含まれていません(False)」として安全に無視させるための防護壁) -
「
st.dataframe(filtered_df, use_container_width=True)」 → 絞り込まれたデータを、スマホやパソコンの画面幅にピッタリ合わせながら(use_container_width=True)、Excelのようにスクロールもできる綺麗な「Webサイト用の表」として画面上にバシッと映し出す最終命令
実際に書いたコード
import pandas as pd
import streamlit as st
# 1. ウェブ画面の一番上に大きなタイトルを表示する
st.title("🎯 インターン情報・名言検索アプリ")
# 2. さっきスクレイピングで保存した「result.csv」を読み込む
# (エラーが起きないよう、念のため文字化け対策のエンコーディングも指定)
df = pd.read_csv("result.csv", encoding="utf-8-sig")
# 3. 画面に文字を入力できる「検索ボックス」を作る
search_query = st.text_input("🔍 キーワードを入力して検索(例: world, choices)")
# 4. もし検索ボックスに文字が入力されたら、データを絞り込む
if search_query:
# 「収集したデータ内容」の列の中に、入力された文字が含まれている行だけを抜き出す
# (case=False をつけることで、大文字・小文字を区別せずに検索できるようにします)
filtered_df = df[
df["収集したデータ内容"].str.contains(search_query, case=False, na=False)
]
else:
# 何も入力されていないときは、すべてのデータをそのまま表示する
filtered_df = df
# 5. 絞り込んだデータを、画面に綺麗な「表(テーブル)」として表示する
st.dataframe(filtered_df, use_container_width=True)