「大量のページを自動で取得したいけど、Python のスクレイピングツールは何を使えばいいのか」という疑問は、個人開発者がよく突き当たる壁です。
結論から言うと、本格的なWebスクレイピングには Scrapy が一番使いやすいです。Ubuntu 24.04 に pip install scrapy するだけでインストールでき、スパイダーと呼ばれるクローラーを数十行で書けます。
本記事では Ubuntu 24.04 LTS(Docker 公式イメージ)で Scrapy 2.16.0 を実際にインストールし、quotes.toscrape.com から実データを取得するまでの手順を解説します。Ubuntu 22.04 との違いも実測で確認しました。
この記事のポイント
- Ubuntu 24.04 では
python3-venvが必須(pip install scrapyを直接打つと PEP 668 エラー) - Scrapy 2.16.0 は Python 3.12.3 対応。
scrapy version -vで Twisted・lxml など依存バージョンも確認できる scrapy startprojectでプロジェクト雛形、scrapy genspiderでスパイダーのテンプレートが自動生成される- デフォルト設定で
ROBOTSTXT_OBEY = True・DOWNLOAD_DELAY = 1が有効になっており、最初から礼儀正しい設定になっている - 実測で quotes.toscrape.com から 5 件のデータを正常取得。JSON Lines 形式で保存するとそのまま分析に使える
目次
- 前提環境
- 手順1:Scrapy をインストールする
- 手順2:プロジェクトを作成してスパイダーを定義する
- 手順3:スパイダーを実行してデータを取得する
- 手順4:データをCSV・JSONで保存する
- よくあるエラーと解決策
- まとめ
前提環境
この記事の手順は以下の環境で実際に動作確認しています。
| 項目 | 値 |
|---|---|
| OS | Ubuntu 24.04.1 LTS(Noble Numbat) |
| Python | Python 3.12.3 |
| Scrapy | 2.16.0 |
| 実行環境 | Docker 公式イメージ ubuntu:24.04 |
| 確認日 | 2026-06-22 |
VPS(Vultr・DigitalOcean など)や WSL2、ローカルの Ubuntu でも同じ手順で動作します。
手順1:Scrapy をインストールする
①Ubuntu 24.04 では venv が必須
Ubuntu 24.04 以降は PEP 668(外部パッケージマネージャとの競合防止)により、pip install をシステム Python に直接実行するとエラーになります。先に python3-venv を入れて仮想環境を使う必要があります。
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Reading package lists… Done
$ sudo apt install -y python3 python3-venv
Setting up python3 (3.12.3-0ubuntu2.1) …
Setting up python3-venv (3.12.3-0ubuntu2.1) …
Ubuntu 22.04 との違い
Ubuntu 22.04 では pip3 install scrapy を root で直接実行できます(警告は出ますが動きます)。ただし venv を使うほうが管理上は明らかに楽なので、22.04 でも venv を使うことをお勧めします。
②仮想環境を作って Scrapy をインストール
$ source scrapy-env/bin/activate
(scrapy-env) $ pip install scrapy
Collecting scrapy
Downloading Scrapy-2.16.0-py3-none-any.whl
Collecting twisted (from scrapy)
Collecting lxml (from scrapy)
Collecting parsel (from scrapy)
Successfully installed Scrapy-2.16.0
③バージョン確認
インストール後に scrapy version -v を実行すると、Scrapy 本体と全依存ライブラリのバージョンが一覧で表示されます。
Scrapy : 2.16.0
lxml : 6.1.1
libxml2 : 2.14.6
cssselect : 1.4.0
parsel : 1.11.0
w3lib : 2.4.1
Twisted : 26.4.0
Python : 3.12.3 (main, Mar 23 2026, 19:04:32) [GCC 13.3.0]
pyOpenSSL : 26.3.0 (OpenSSL 4.0.1 9 Jun 2026)
cryptography : 49.0.0
Platform : Linux-6.8.0-83-generic-x86_64-with-glibc2.39


Twisted が非同期ネットワーク処理の中核、lxml が HTML パーサー、parsel が CSS/XPath セレクターを担当します。バージョンが揃っていれば問題なく動きます。


手順2:プロジェクトを作成してスパイダーを定義する
①scrapy startproject でプロジェクトを作成
Scrapy はプロジェクト単位でスパイダーを管理します。scrapy startproject コマンドでディレクトリ構造と設定ファイルが自動生成されます。
New Scrapy project ‘myproject’, using template directory
‘…/scrapy/templates/project’, created in:
/home/user/myproject
You can start your first spider with:
cd myproject
scrapy genspider example example.com

生成されるファイルの役割をまとめると以下の通りです。
| ファイル | 役割 |
|---|---|
settings.py |
クロール設定(遅延・同時接続数・ミドルウェア等) |
items.py |
取得データのフィールド定義 |
pipelines.py |
取得後のデータ処理(DB保存・クリーニング等) |
middlewares.py |
リクエスト・レスポンスの前処理・後処理 |
spiders/ |
スパイダーを置くディレクトリ(ここにメインロジック) |
②scrapy genspider でスパイダーのテンプレートを生成
スパイダーは scrapy genspider コマンドで雛形を作ります。allowed_domains と start_urls が自動で設定されます。
Created spider ‘quotes’ using template ‘basic’ in module:
myproject.spiders.quotes
生成される myproject/spiders/quotes.py はこんな内容です。
class QuotesSpider(scrapy.Spider):
name = “quotes”
allowed_domains = [“quotes.toscrape.com”]
start_urls = [“https://quotes.toscrape.com”]
def parse(self, response):
pass ← ここに取得ロジックを書く
③parse メソッドにデータ取得ロジックを書く
実際に名言サイト(quotes.toscrape.com)からテキスト・著者・タグを取得するスパイダーに書き換えます。CSS セレクターで要素を指定します。
class QuotesSpider(scrapy.Spider):
name = “quotes”
start_urls = [“https://quotes.toscrape.com”]
def parse(self, response):
for quote in response.css(“div.quote”):
yield {
“text”: quote.css(“span.text::text”).get(),
“author”: quote.css(“small.author::text”).get(),
“tags”: quote.css(“a.tag::text”).getall(),
}
next_page = response.css(“li.next a::attr(href)”).get()
if next_page:
yield response.follow(next_page, self.parse)
response.css("div.quote") で各名言ブロックを取得し、その中から ::text 疑似要素でテキストを抽出しています。response.follow() で次のページへ自動的に追跡する点が Scrapy の便利なところです。
手順3:スパイダーを実行してデータを取得する
①scrapy crawl でクロールを実行
scrapy crawl コマンドにスパイダー名を渡すとクロールが始まります。LOG_LEVEL=INFO を付けると各リクエストの状態が表示され、完了時にページ数・件数・経過時間などの統計が出力されます。
2026-06-22 [scrapy.core.engine] INFO: Spider opened
2026-06-22 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://quotes.toscrape.com>
2026-06-22 [scrapy.core.engine] DEBUG: Crawled (200) <GET /page/2/>
…
2026-06-22 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{‘item_scraped_count’: <取得件数>,
‘response_received_count’: <ページ数>,
‘elapsed_time_seconds’: <経過秒数>}
注意
上のログ中の数値はクロール対象のページ数・件数によって変わります。quotes.toscrape.com の場合、全ページを取ると 100 件程度になります。具体的な数値は実際に実行して確認してください。
②テスト実行は CLOSESPIDER_ITEMCOUNT が便利
開発中は -s CLOSESPIDER_ITEMCOUNT=5 オプションで取得件数を制限するのが手軽です。実際にコンテナで実行したところ、5 件を取得してスパイダーが正常に終了しました。
{‘text’: ‘”The world as we have created it is a process of our thinking…”‘,
‘author’: ‘Albert Einstein’, ‘tags’: [‘change’, ‘thinking’, ‘world’]}
{‘text’: ‘”It is our choices, Harry, that show what we truly are…”‘,
‘author’: ‘J.K. Rowling’, ‘tags’: [‘abilities’, ‘choices’]}
{‘text’: ‘”There are only two ways to live your life…”‘,
‘author’: ‘Albert Einstein’, ‘tags’: [‘inspirational’, ‘life’, ‘miracle’]}
… 計5件取得


手順4:データをCSV・JSONで保存する
Scrapy は -o オプションで出力形式を拡張子で自動判定します。拡張子を変えるだけで CSV・JSON・JSON Lines に切り替えられます。
(scrapy-env) $ scrapy crawl quotes -o quotes.jl
# CSV(Excel で開きたい場合)
(scrapy-env) $ scrapy crawl quotes -o quotes.csv
# JSON(一括配列形式)
(scrapy-env) $ scrapy crawl quotes -o quotes.json
(scrapy-env) $ head -1 quotes.jl
{“text”: ““The world as we have created it…””, “author”: “Albert Einstein”, “tags”: [“change”, “thinking”, “world”]}
大量データを扱う場合は JSON Lines(.jl)が向いています。JSON の場合は全件をメモリに抱えてから書き出すので、件数が多いと重くなります。
settings.py の重要な設定
ROBOTSTXT_OBEY = True(デフォルト)— robots.txt を自動で遵守します。スクレイピング禁止のサイトには最初からアクセスしない設計ですDOWNLOAD_DELAY = 1(デフォルト)— リクエスト間に 1 秒の待機を入れます。サーバーに負荷をかけないための安全弁ですCONCURRENT_REQUESTS_PER_DOMAIN = 1(デフォルト)— 同一ドメインへの並列接続を 1 本に制限します
よくあるエラーと解決策
①error: externally-managed-environment(Ubuntu 24.04)
× This environment is externally managed
hint: If you want to install Python packages system-wide, …
Ubuntu 24.04 で pip3 install scrapy を直接実行したときに出るエラーです。解決策は仮想環境を使うことです。
(scrapy-env) $ pip install scrapy
Successfully installed Scrapy-2.16.0
②ModuleNotFoundError: No module named ‘scrapy’
仮想環境を activate せずに scrapy を実行したときに起きます。source scrapy-env/bin/activate を実行してからもう一度試してください。
③FileNotFoundError: [Errno 2] No such file or directory: ‘scrapy.cfg’
scrapy crawl をプロジェクトのルートディレクトリ以外で実行したときに出ます。scrapy.cfg があるディレクトリに cd してから実行してください。
(scrapy-env) $ scrapy crawl quotes
…
④robots.txt で弾かれてアイテムが0件
デフォルトで ROBOTSTXT_OBEY = True なので、robots.txt で禁止されているパスはクロールしません。settings.py で ROBOTSTXT_OBEY = False にすれば回避できますが、サイトの利用規約をかならず確認してください。
まとめ
Ubuntu 24.04 での Scrapy 2.16.0 の実測結果をまとめます。
- Ubuntu 24.04 は PEP 668 対応のため
python3-venvで仮想環境を作ってからpip install scrapy - Ubuntu 22.04 でも同じ Scrapy 2.16.0 が入る。Python は 3.10.12 になる
scrapy startproject→scrapy genspiderの 2 ステップでプロジェクトと雛形スパイダーが揃う- 実測で quotes.toscrape.com から 5 件を正常取得。JSON Lines 形式での保存も確認済み
- デフォルト設定で robots.txt 遵守・1 秒待機・同時接続制限が入っており、礼儀正しい設定になっている
Scrapy を使い慣れてきたら、自前の VPS(Vultr・DigitalOcean など)に常駐させてスケジューリングするのが次のステップです。VPS の選び方は VPS 比較記事 をご覧ください。


コメント