Scrapy on Ubuntu — Pythonスパイダーで大規模Webスクレイピング

開発環境

「大量のページを自動で取得したいけど、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 = TrueDOWNLOAD_DELAY = 1 が有効になっており、最初から礼儀正しい設定になっている
  • 実測で quotes.toscrape.com から 5 件のデータを正常取得。JSON Lines 形式で保存するとそのまま分析に使える

目次

前提環境

この記事の手順は以下の環境で実際に動作確認しています。

項目
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 を入れて仮想環境を使う必要があります。




ubuntu@linuxlab: ~
$ sudo apt update
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 をインストール




ubuntu@linuxlab: ~
$ python3 -m venv scrapy-env
$ 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 本体と全依存ライブラリのバージョンが一覧で表示されます。




ubuntu@linuxlab: ~
(scrapy-env) $ scrapy version -v
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
Scrapy 2.16.0 インストール確認(Ubuntu 24.04 LTS)
Scrapy 2.16.0 インストール確認(Ubuntu 24.04 LTS)
Scrapy インストール実ログ(Ubuntu 24.04 LTS・実測)
Scrapy インストール実ログ(Ubuntu 24.04 LTS・実測)

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

Scrapy 2.16.0 主要依存パッケージ一覧(ubuntu:24.04 実測)
Scrapy 2.16.0 主要依存パッケージ一覧(ubuntu:24.04 実測)
Ubuntu バージョン別 Scrapy インストール比較(実測)
Ubuntu バージョン別 Scrapy インストール比較(実測)

手順2:プロジェクトを作成してスパイダーを定義する

①scrapy startproject でプロジェクトを作成

Scrapy はプロジェクト単位でスパイダーを管理します。scrapy startproject コマンドでディレクトリ構造と設定ファイルが自動生成されます。




ubuntu@linuxlab: ~
(scrapy-env) $ scrapy startproject myproject
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
scrapy startproject で生成されるプロジェクト構造(実測)
scrapy startproject で生成されるプロジェクト構造(実測)

生成されるファイルの役割をまとめると以下の通りです。

ファイル 役割
settings.py クロール設定(遅延・同時接続数・ミドルウェア等)
items.py 取得データのフィールド定義
pipelines.py 取得後のデータ処理(DB保存・クリーニング等)
middlewares.py リクエスト・レスポンスの前処理・後処理
spiders/ スパイダーを置くディレクトリ(ここにメインロジック)

②scrapy genspider でスパイダーのテンプレートを生成

スパイダーは scrapy genspider コマンドで雛形を作ります。allowed_domainsstart_urls が自動で設定されます。




ubuntu@linuxlab: ~/myproject
(scrapy-env) $ scrapy genspider quotes quotes.toscrape.com
Created spider ‘quotes’ using template ‘basic’ in module:
myproject.spiders.quotes

生成される myproject/spiders/quotes.py はこんな内容です。




myproject/spiders/quotes.py
import scrapy

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 セレクターで要素を指定します。




myproject/spiders/quotes.py(完成版)
import scrapy

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 の便利なところです。

正直、response.follow() を初めて使ったときは驚きました。相対URLも絶対URLも区別なく渡せて、ページネーションが2行で書けてしまう。BeautifulSoup に比べてコード量が半分以下になります。

手順3:スパイダーを実行してデータを取得する

①scrapy crawl でクロールを実行

scrapy crawl コマンドにスパイダー名を渡すとクロールが始まります。LOG_LEVEL=INFO を付けると各リクエストの状態が表示され、完了時にページ数・件数・経過時間などの統計が出力されます。




ubuntu@linuxlab: ~/myproject
(scrapy-env) $ scrapy crawl quotes -s 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 件を取得してスパイダーが正常に終了しました。




ubuntu@linuxlab: ~/myproject
(scrapy-env) $ scrapy crawl quotes -s CLOSESPIDER_ITEMCOUNT=5 -s LOG_LEVEL=ERROR
{‘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件取得
Spider 実行結果(quotes.toscrape.com から5件取得・実測)
Spider 実行結果(quotes.toscrape.com から5件取得・実測)
Scrapy スパイダー実行結果(quotes.toscrape.com 実測)
Scrapy スパイダー実行結果(quotes.toscrape.com 実測)

手順4:データをCSV・JSONで保存する

Scrapy は -o オプションで出力形式を拡張子で自動判定します。拡張子を変えるだけで CSV・JSON・JSON Lines に切り替えられます。




ubuntu@linuxlab: ~/myproject
# JSON Lines(1行1件・大容量でも扱いやすい)
(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)




ubuntu@linuxlab: ~
error: externally-managed-environment
× This environment is externally managed
hint: If you want to install Python packages system-wide, …

Ubuntu 24.04 で pip3 install scrapy を直接実行したときに出るエラーです。解決策は仮想環境を使うことです。




ubuntu@linuxlab: ~
$ python3 -m venv scrapy-env && source scrapy-env/bin/activate
(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 してから実行してください。




ubuntu@linuxlab: ~
$ cd myproject ← scrapy.cfg があるディレクトリへ移動
(scrapy-env) $ scrapy crawl quotes

④robots.txt で弾かれてアイテムが0件

デフォルトで ROBOTSTXT_OBEY = True なので、robots.txt で禁止されているパスはクロールしません。settings.pyROBOTSTXT_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 startprojectscrapy genspider の 2 ステップでプロジェクトと雛形スパイダーが揃う
  • 実測で quotes.toscrape.com から 5 件を正常取得。JSON Lines 形式での保存も確認済み
  • デフォルト設定で robots.txt 遵守・1 秒待機・同時接続制限が入っており、礼儀正しい設定になっている

Scrapy を使い慣れてきたら、自前の VPS(Vultr・DigitalOcean など)に常駐させてスケジューリングするのが次のステップです。VPS の選び方は VPS 比較記事 をご覧ください。

コメント

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