Pythonでは、Webサイトに掲載されている情報を自動で取得することができます。
このような仕組みをWebスクレイピングと呼びます。
例えば、
- Webページのタイトルを取得する
- Webページ内の文章を取得する
- 複数ページの情報をまとめて取得する
- 商品情報を一覧にする
- ニュース記事のタイトルを取得する
といった処理をPythonで自動化できます。
この記事では、Python初心者向けに、Webスクレイピングの基本をやさしく解説します。
Webスクレイピングとは?
Webスクレイピングとは、Webページから必要な情報をプログラムで取得する技術です。
例えば、人間がWebサイトを開いて、
Webサイトを開く
↓
ページを見る
↓
必要な情報を探す
↓
コピーする
↓
Excelに貼り付ける
という作業をしているとします。
これをPythonにやってもらうイメージです。
Python
↓
Webページにアクセス
↓
HTMLを取得
↓
必要な情報を取り出す
↓
画面に表示・ファイルに保存
大量の情報を扱う場合には、特に便利です。
PythonでWebスクレイピングをするには?
PythonでWebスクレイピングをする方法はいくつかあります。
初心者が最初に覚えるなら、
requests + Beautiful Soup
という組み合わせがおすすめです。
requestsはWebページを取得するために使い、Beautiful Soupは取得したHTMLから必要な情報を取り出すために使います。
requests
↓
Webページを取得
↓
HTML
↓
Beautiful Soup
↓
必要な情報を取得
必要なライブラリをインストールする
requestsとBeautiful Soupは、Pythonの標準機能ではありません。
そのため、最初にインストールします。
コマンドプロンプトやターミナルを開いて、次のコマンドを実行してください。
pip install requests beautifulsoup4
環境によって pip が使えない場合は、
python -m pip install requests beautifulsoup4
でもインストールできます。
Windowsでは、
py -m pip install requests beautifulsoup4
という方法もあります。
ライブラリが使えるか確認する
インストールが終わったら、次のプログラムを実行してみましょう。
import requests
from bs4 import BeautifulSoup
print("Webスクレイピングの準備ができました!")
エラーが出なければ準備完了です。
Webページを取得してみる
まずはWebページのHTMLをPythonで取得してみましょう。
今回は例として、Webスクレイピング練習用サイトを使います。
import requests
url = "https://toscrape.com/"
response = requests.get(url)
print(response.text)
実行すると、大量の文字が表示されます。
これはWebページのHTMLです。
ブラウザでは普通のWebページとして表示されますが、その中身にはHTMLという情報が含まれています。
requestsとは?
requestsは、PythonからWebサイトなどにHTTPリクエストを送るためのライブラリです。
例えば、
response = requests.get(url)
とすると、指定したURLのWebページを取得できます。
イメージとしては、
Python
↓
「このWebページをください」
↓
Webサーバー
↓
HTMLを返す
↓
Python
という流れです。
HTMLとは?
Webページは、HTMLという言語を使って構成されています。
例えば、非常に簡単なHTMLなら、
<h1>Python入門</h1>
<p>Pythonについて学びましょう。</p>
のようになっています。
ブラウザはこのHTMLを解釈して、
Python入門
Pythonについて学びましょう。
というWebページとして表示します。
Webスクレイピングでは、このHTMLから必要な情報を取り出します。
Beautiful Soupを使ってHTMLを解析する
ここで登場するのがBeautiful Soupです。
import requests
from bs4 import BeautifulSoup
url = "https://toscrape.com/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
print(soup.title)
実行すると、Webページの <title> 要素を取得できます。
例えば、
<title>Scraping Sandbox</title>
のような情報が表示されます。
BeautifulSoup()とは?
この部分です。
soup = BeautifulSoup(response.text, "html.parser")
取得したHTMLをBeautiful Soupで解析しています。
response.textにはWebページのHTMLが入っています。
Webページ
↓
requests
↓
response.text
↓
Beautiful Soup
↓
HTMLを解析
という流れです。
Webページのタイトルだけ取得する
Webページのタイトルだけを取得してみましょう。
import requests
from bs4 import BeautifulSoup
url = "https://toscrape.com/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
print(soup.title.text)
textを付けることで、HTMLタグではなく中の文字だけを取得できます。
例えば、
<title>Scraping Sandbox</title>
から、
Scraping Sandbox
という文字列を取り出せます。
見出しを取得する
Webページには、
<h1>見出し</h1>
<h2>小見出し</h2>
のような見出しがあります。
Beautiful Soupを使えば、こうした情報も取得できます。
例えば、
import requests
from bs4 import BeautifulSoup
url = "https://toscrape.com/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
heading = soup.find("h1")
print(heading.text)
find()を使うことで、指定したHTML要素を探すことができます。
find()とは?
例えば、
soup.find("h1")
とすると、HTMLの中から最初の <h1> 要素を探します。
同じように、
soup.find("p")
なら、最初の <p> 要素を探します。
soup.find("title")
なら、<title>要素を探します。
このように、HTMLのタグを指定して情報を探せます。
複数の要素を取得する
Webページに同じ種類のHTML要素が複数ある場合は、find_all()を使います。
例えば、すべてのリンクを取得してみます。
import requests
from bs4 import BeautifulSoup
url = "https://toscrape.com/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
links = soup.find_all("a")
for link in links:
print(link.text)
これで、ページ内にある <a>タグの文字を順番に表示できます。
このプログラムで取得できるのはあくまでも、ユーザーに見えているリンクの文字部分です。
リンク先のURL(アドレス)自体を取得したい場合は、次のプログラムを使います。
リンク先のURLを取得する
Webページのリンクには、リンク先のURLも含まれています。
例えば、
<a href="https://toscrape.com/">Scraping Sandbox</a>
というHTMLがあった場合、
Scraping Sandbox
がリンクの文字、
https://toscrape.com/
がリンク先です。
Pythonからリンク先を取得するには、
import requests
from bs4 import BeautifulSoup
url = "https://toscrape.com/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
links = soup.find_all("a")
for link in links:
print(link.get("href"))
とします。
get("href")によって、href属性の値を取得できます。
スクレイピングした情報をCSVに保存する
ここまで学んできたCSVと組み合わせると、さらに便利になります。
例えば、Webページから取得した情報をCSVファイルに保存できます。
import csv
import requests
from bs4 import BeautifulSoup
url = "https://toscrape.com/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
links = soup.find_all("a")
with open("links.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["リンク文字", "URL"])
for link in links:
text = link.text.strip()
href = link.get("href")
writer.writerow([text, href])
print("CSVファイルを作成しました!")
これで、
Webサイト
↓
Pythonで取得
↓
Beautiful Soupで解析
↓
必要な情報を抽出
↓
CSVに保存
という処理ができます。
これは、前の記事で学んだCSV操作がそのまま活かされています。
PythonでCSVを操作する方法については、こちらの記事で解説しています。
Webスクレイピングには注意点がある
Webスクレイピングは便利ですが、どんなWebサイトでも自由に情報を取得してよいわけではありません。
スクレイピングする前に、
- Webサイトの利用規約
- robots.txt
- 著作権
- サーバーへの負荷
- 個人情報
などを確認することが重要です。
特に、短時間に大量のアクセスを繰り返すようなプログラムは、Webサーバーに大きな負荷をかける可能性があります。
練習するときも、必要以上に何度もアクセスしないようにしましょう。
Webスクレイピングでできること
基本を理解すると、さまざまな処理に応用できます。
例えば、
商品情報の取得
商品名
価格
URL
などを取得して一覧にする。
ニュース情報の取得
記事タイトル
URL
公開日時
などを取得する。
Webページの情報収集
複数のページから必要な情報を集めて、CSVやExcelに保存する。
定期的な情報収集
Pythonのプログラムを定期的に実行して、Web上の情報を収集する。
このように、Webスクレイピングは情報収集の自動化と相性がいい技術です。
WebスクレイピングとPythonの自動化
これまでの記事では、
- ファイル名の変更
- 画像の一括処理
- CSVの読み書き
- Excelファイルの操作
について学びました。
ここにWebスクレイピングが加わると、Pythonでできる自動化の幅がさらに広がります。
例えば、
Webサイト
↓
情報を取得
↓
必要なデータだけ取り出す
↓
CSVに保存
↓
Excelで確認
という一連の処理をPythonで自動化できます。
つまり、これまで別々に学んできた機能を組み合わせて使えるようになります。
まとめ
今回はPythonを使ったWebスクレイピングの基本を紹介しました。
覚えておきたいポイントは次のとおりです。
- WebスクレイピングはWebページから情報を取得する技術
requestsでWebページを取得できる- Beautiful SoupでHTMLを解析できる
find()で特定の要素を取得できるfind_all()で複数の要素を取得できるget("href")でリンク先URLを取得できる- CSVと組み合わせると情報を保存できる
- Webスクレイピングでは利用規約やサーバーへの負荷に注意する
Pythonは、単にプログラムを作るだけではなく、Web・ファイル・Excel・CSVなどをつないで作業を自動化できるのが大きな魅力です。
今回のWebスクレイピングも、これまで学んできたPythonの知識と組み合わせることで、より実用的なプログラムを作れるようになります。
