Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonとScrapyで実現するWebスクレイピング入門:インストールからデータ抽出まで

クローラー(Web巡回プログラム)を開発するためのフレームワークの中でも、特に優れているのが「Scrapy」です。Scrapyは人気の高いWebスクレイピング・クローリングフレームワークであり、高レベルな機能を提供することで、Webサイトからのデータ抽出を格段に簡単にしてくれます。

本記事では、Scrapyのインストール方法から、実際にWebページを取得し、タイトルやリンクなどの情報を抽出するまでの一連の流れを解説します。

Scrapyのインストール

Windows環境へのScrapyのインストールは非常に簡単です。pipを使う方法と、Anacondaを利用している場合はcondaを使う方法の2通りがあります。なお、ScrapyはPython 2系と3系の両方で動作しますが、現在はPython 3系の利用を推奨します。

pipを使用する場合:

pip install Scrapy

condaを使用する場合:

conda install -c conda-forge scrapy

正しくインストールされていれば、ターミナル上でscrapyコマンドが使えるようになります。以下のようにバージョン情報や利用可能なコマンド一覧が表示されれば成功です。

C:\Users\rajesh>scrapy
Scrapy 1.6.0 - no active project

Usage:
scrapy <command> [options] [args]

Available commands:
bench         Run quick benchmark test
fetch         Fetch a URL using the Scrapy downloader
genspider     Generate new spider using pre-defined templates
runspider     Run a self-contained spider (without creating a project)
settings      Get settings values
shell         Interactive scraping console
startproject  Create new project
version       Print Scrapy version
view          Open URL in browser, as seen by Scrapy

[ more ] More commands available when run from project directory

Use "scrapy <command> -h" to see more info about a command.

プロジェクトの作成

Scrapyのインストールが完了したら、startprojectコマンドを実行して、最初のScrapyプロジェクトのひな形を生成しましょう。

手順は以下の通りです。まずターミナルを開き、Scrapyプロジェクトを保存したいディレクトリへ移動します。その後、scrapy startproject <プロジェクト名>を実行します。ここでは例として「scrapy_example」というプロジェクト名を使用しています。

C:\Users\rajesh>scrapy startproject scrapy_example
New Scrapy project 'scrapy_example', using template directory 'c:\python\python361\lib\site-packages\scrapy\templates\project', created in:
C:\Users\rajesh\scrapy_example

You can start your first spider with:
cd scrapy_example
scrapy genspider example example.com

生成されたプロジェクトの構成は以下のようになっています。

C:.
│ scrapy.cfg
│
└───scrapy_example
    │ items.py
    │ middlewares.py
    │ pipelines.py
    │ settings.py
    │ __init__.py
    │
    ├───spiders
    │   │ __init__.py
    └───__pycache__
  • items.py:スクレイピングするデータの構造を定義するファイル
  • middlewares.py:リクエスト・レスポンス処理をカスタマイズするミドルウェア
  • pipelines.py:抽出したデータを加工・保存するパイプライン
  • settings.py:プロジェクト全体の設定ファイル
  • spiders/:実際のクローリングロジックを記述するスパイダーを格納するディレクトリ

ScrapyシェルでWebページを取得してみる

もう一つの手軽な方法として、scrapy shellを起動して対話的にWebスクレイピングを行うことができます。試しにWSJ(Wall Street Journal)のインド版ページを取得してみましょう。

In [18]: fetch("https://www.wsj.com/india")
2019-02-04 22:38:53 [scrapy.core.engine] DEBUG: Crawled (200) https://www.wsj.com/india> (referer: None)

ステータスコード200が返ってきたので、正常にページをダウンロードできています。

Scrapyクローラーは、ダウンロードした情報を含む「response」オブジェクトを返します。取得した内容をブラウザで確認してみましょう。

In [19]: view(response)
Out[19]: True

このコマンドを実行すると、デフォルトブラウザでWebページが開き、Scrapyが取得した内容を確認できます。表示されたページが元のWebページとほぼ同じであれば、クローラーがページ全体を正常にダウンロードできたことになります。

次に、responseオブジェクトの中身を見てみましょう。print(response.text)と入力すると、ダウンロードしたHTMLソース全体が出力されます。

In [22]: print(response.text)
<!DOCTYPE html>
<html data-region="asia,india" data-protocol="https" data-reactid=".2316x0ul96e" data-react-checksum="851122071">
  <head data-reactid=".2316x0ul96e.0">
    <title data-reactid=".2316x0ul96e.0.0">The Wall Street Journal & Breaking News, Business,
    Financial and Economic News, World News and Video</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    ...(以下、HTMLが続く)

HTMLのhead要素には、ページのタイトルやmeta情報など、さまざまなデータが含まれていることがわかります。

Webページから重要な情報を抽出してみよう

ページタイトルの抽出

Scrapyでは、CSSセレクター(class、idなど)に基づいてHTMLから情報を抽出できます。抽出したい要素のCSSセレクターを調べるには、対象のページ上で右クリックして「検証(Inspect)」を選択します。

すると、ブラウザ内にデベロッパーツールが開きます。

ここで注目すべきは、「wsj-headline-link」というCSSクラスが、見出しタイトルを持つすべてのアンカータグ(<a>)に適用されている点です。この情報をもとに、responseオブジェクトからすべての見出しを抽出してみます。

response.css()は、渡されたCSSセレクターに基づいてコンテンツを抽出する関数です。具体的な使用例を見てみましょう。

最初の見出しテキストのみを取得する場合:

In [24]: response.css(".wsj-headline-link::text").extract_first()

Out[24]: 'China Fears Loom Over Stocks After January Surge'

アンカータグごと(HTML要素全体)を取得する場合:

In [25]: response.css(".wsj-headline-link").extract_first()

Out[25]: '<a class="wsj-headline-link" href="https://www.wsj.com/articles/china-fears-loom-over-stocks-after-january-surge-11549276200">China Fears Loom Over Stocks After January Surge</a>'

ページ内のすべてのリンクを抽出

Webページからすべてのリンク(href属性)を取得したい場合は、以下のコードを実行します。

links = response.css('a::attr(href)').extract()

実行結果の例:

['https://www.google.com/intl/en_us/chrome/browser/desktop/index.html',
'https://support.apple.com/downloads/',
'https://www.mozilla.org/en-US/firefox/new/',
'https://www.barrons.com',
'https://bigcharts.marketwatch.com',
'https://www.dowjones.com/',
'https://www.marketwatch.com',
'https://www.harpercollins.com/',
'https://housing.com/',
'https://nypost.com/',
......

コメント数の抽出

同様の手法で、WSJページ上の記事ごとのコメント数も取得できます。

In [38]: response.css(".wsj-comment-count::text").extract()

Out[38]: ['71', '59']

まとめ

本記事では、Scrapyを使ったWebスクレイピングの基本として、インストール、プロジェクト作成、Scrapyシェルによるページ取得、CSSセレクターを活用した情報抽出までを紹介しました。

ここで紹介したのはあくまで入門編です。Scrapyには、複数ページの巡回、データのパイプライン処理、スパイダーによる本格的なクローリングなど、さらに多くの強力な機能が備わっています。ぜひ実際にプロジェクトを作成して、Scrapyの可能性を探ってみてください。

  1. PythonでWebスクレイピング!主要ライブラリ6選の特徴と使い方を徹底解説

    Webスクレイピングとは コンピュータサイエンスにおけるWebスクレイピング(Web Scraping)とは、Webサイトからデータを抽出する技術のことです。この手法を活用することで、Web上に散在する非構造化データを、分析や加工がしやすい構造化データへと変換できます。 Python 3でよく使われる代表的なスクレイピングツールは以下の6つです。 Urllib(urllib.request) Requests BeautifulSoup Lxml Selenium MechanicalSoup 1. Urllib(urllib.request) UrllibはPythonに標準で組み込ま

  2. MacでPython 3にアップグレードして使いこなす方法

    購入したばかりの新しいMacには、必要なソフトウェアの最新版がすべて入っていると思いがちですが、ユーザー向けアプリについては概ね正しくても、基盤となるフレームワークに関しては話が別です。安定版の最新リリースがPython 3.5であるにもかかわらず、新しいMacには今なおPython 2.7.10がプリインストールされています。バージョン間の差が大きく感じられるのはそのためです。ただし、新しいバージョンが必ずしも優れているとは限りません。Python 3はPython 2との後方互換性を持たず、多くの開発者は依然としてPython 2を使い続けているのです。 2to3を使うか、使わないか?