Pythonでスクレイピングして得たデータをExcelに書き込むプログラムを作成する場合、requests と BeautifulSoup でウェブスクレイピングを行い、pandas または openpyxl などのライブラリを使用してExcelファイルにデータを書き込むことが一般的です。
以下に、簡単な例を示します。
まず、必要なライブラリをインストールします(まだインストールされていない場合)。
pip install requests beautifulsoup4 pandas openpyxlmac環境ならpipをpip3と打ちましょう。
次に、ウェブページからデータをスクレイピングしてExcelファイルに書き込むサンプルコードを示します。
import requests
from bs4 import BeautifulSoup
import pandas as pd
# スクレイピングするURL
url = 'スクレイピングするウェブページのURL'
# Requestsを使ってウェブページを取得する
response = requests.get(url)
# ウェブページのHTMLをパースする
soup = BeautifulSoup(response.text, 'html.parser')
# スクレイピングするデータを格納するためのリスト
data = []
# スクレイピングする要素の例(ここではtableのtrを想定)
table_rows = soup.find_all('tr')
for row in table_rows:
# 各行のtdタグをすべて取得する
cols = row.find_all('td')
# テキストを取得してリストに追加する
data.append([ele.text.strip() for ele in cols])
# pandas DataFrameにデータを変換
df = pd.DataFrame(data)
# 不要な空の行を削除
df.dropna(inplace=True)
# DataFrameの内容をExcelファイルに書き出す
excel_filename = 'scraped_data.xlsx'
df.to_excel(excel_filename, index=False)
print(f'{excel_filename}にデータを書き込みました。')
このコードは、指定したURLからテーブル形式のデータをスクレイピングし、それをpandasのDataFrameに変換してからExcelファイルに書き込んでいます。
注意点:
- 上記のコードは、取得するデータに合わせてカスタマイズする必要があります(例:テーブルの行を取得する、特定のクラス名を持つ要素を取得するなど)。
- スクレイピングを行う際には、対象のウェブサイトの利用規約を確認し、違反していないことを確認してください。
- ウェブサイトによってはスクレイピングに対して制限を設けている場合があります。そのため、スクレイピングには適切な間隔をおき、サーバーに負担をかけないようにしましょう。
エクセルファイルが文字化けする場合
エクセルファイルへの出力時に文字化け起きていた場合は、
文字コード指定してエンコーディングしなければいけません。
具体的にはエクセルは以下のどちらかのエンコーディングで正常に動作します。
# Requestsを使ってウェブページを取得する
response = requests.get(url)の下に、以下のどちらかを記述してみましょう。
response.encoding = 'shift_jis' # または正しいエンコーディングに設定もしくは、
response.encoding = 'utf-8' # または正しいエンコーディングに設定エクセルが正常に動作するのはどちらの文字コードだったかを確認してください。
また、確認できたひとはウェブサイトから情報を取得するさい、h1意外の情報を取得できるようにプログラムを改変してみましょう。
特定のタグとclassを指定して取得する参考プログラム
import requests
from bs4 import BeautifulSoup
import pandas as pd
# スクレイピングするURL
url = 'http://example.com'
# requestsを使ってURLのHTMLを取得
response = requests.get(url)
response.raise_for_status() # HTTPエラーがあれば例外を投げます
# BeautifulSoupオブジェクトを作成し、パーサーは'html.parser'を使う
soup = BeautifulSoup(response.text, 'html.parser')
# 特定のタグとclassを持つ要素をすべて取得
# 例として、'div'タグでclassが'some-class'の要素を探します
elements = soup.find_all('div', class_='some-class')
# 取得した要素からテキストを抽出
texts = [el.get_text(strip=True) for el in elements]
# テキストのリストをDataFrameに変換
df = pd.DataFrame(texts, columns=['Column Name'])
# DataFrameをエクセルファイルに書き込み
excel_path = 'output.xlsx'
df.to_excel(excel_path, index=False)
print(f'Done. Data is written to {excel_path}')
一つ前のプログラムと比較し、どこに差分があるかをチェックして自分なりに手を加えてオリジナルを作ってみてください。
