Skip to content

nakatatsu711/scraping_news_with_scrapy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 

Repository files navigation

概要

Scrapyでニュースサイトをスクレイピングするプログラムです。

Yahoo!ニュースgooニュースから記事のタイトルと要約を取得します。

システム環境

以下で動作確認済みです。
OS:macOS 11.2.2
Python:3.6.9

実行方法

ライブラリインストール

以下の2通りの方法がありますので、どちらかでインストールしてください。

$ pip install scrapy
$ pip install -r requirements.txt

プロジェクトの作成

newsというプロジェクトを作成します。テンプレートが作成されます。

$ scrapy startproject news

コマンドを実行する際は、基本的にこのnewsディレクトリで実行するので、移動しておきます。

$ cd news

ダウンロード間隔の設定

settings.pyで設定します。

相手サイトに負荷をかけすぎないように必ず設定しておきましょう。
今回は1秒に設定してあります。

DOWNLOAD_DELAY = 1

Spiderの作成

Scrapyを使うのに、主に作成するのがSpiderというクラスです。
対象のWebサイトごとにSpiderを作成し、クローリングの設定やスクレイピングの処理を記述します。

scrapy genspiderコマンドであらかじめ定義されているテンプレートからSpiderを作成できます。
第1引数にSpiderの名前、第2引数にドメイン名を指定します。

例えば、以下のコマンドではspidersディレクトリ内にnews_crawl.pyというファイルが作成されます。

$ scrapy genspider news_crawl news.yahoo.co.jp

ファイルが作成されたら、これをベースに書き換えていきます。

Itemの作成

ItemはSpiderが抜き出したデータを格納しておくためのオブジェクトです。
items.pyにクラスを作成することでItemを定義できます。items.pyを好きなように書き換えてみてください。

Pipelineの作成

ItemPipeline(以下、Pipeline)はSpiderから抽出したItemに対して任意の処理を行うためのコンポーネントです。
piplines.pyにクラスを作成することでPipelineを定義できます。piplines.pyを好きなように書き換えてみてください。

作成したPipelineを使用するためには、settings.pyに設定を追加する必要があります。
ValidationPipelineというクラスを作成した場合は以下のように設定します。

ITEM_PIPELINES = {
    'news.pipelines.ValidationPipeline': 300,
}

実行の流れ

scraping-news-with-scrapy-1


ScrapyEngine:他のコンポーネントを制御する実行エンジン
Scheduler:Requestをキューに溜める
Downloader:Requestが指すURLのページを実際にダウンロードする
Spider:ダウンロードしたResponseを受け取り、ページからItemや次にたどるリンクを表すRequestを抜き出す
FeedExporter:Spiderが抜き出したItemをファイルなどに保存する
ItemPipeline:Spiderが抜き出したItemに関する処理を行う
DownloaderMiddleware:Downloaderの処理を拡張する
SpiderMiddleware:Spiderへの入力となるResponseやSpiderからの出力となるItemやRequestに対しての処理を拡張する


Spiderを実行すると、最初にstart_urls属性に含まれるURLを指すRequestオブジェクトがScrapyのSchedulerに渡され、Webページの取得を待つキューに追加されます。

キューに追加されたRequestオブジェクトは順にDownloaderに渡されます。
DownloaderはRequestオブジェクトに指定されたURLのページを取得し、Responseオブジェクトを作成します。

Downloaderの処理が完了すると、ScrapyEngineがSpiderのコールバック関数を呼び出します。
デフォルトのコールバック関数はSpiderのparse()メソッドです。
コールバック関数には引数としてResponseオブジェクトが渡されるので、ここからリンクやデータを抽出します。

コールバック関数ではyield文で複数のオブジェクトを返せます。
リンクを抽出して次のページをクロールしたい場合は、Requestオブジェクトをyieldします。
データを抽出したい場合は、Itemオブジェクトをyieldします。
Requestオブジェクトをyieldした場合、再びSchedulerのキューに追加されます。
Itemオブジェクトをyieldした場合、FeedExporterに送られ、ファイルなどに保存されます。

実行

コマンドラインで実行します。
スクレイピングしたItemはnews_crawl.jlというファイルに保存されます。

$ scrapy crawl news_crawl -o news_crawl.jl

結果表示方法

news_crawl.jlファイルの中身はJSON Lines形式で、各行にJSONオブジェクトを持つテキスト形式となっています。

日本語がエスケープされているので、jqコマンドで読めるようにします。
jqはmacOSの場合はHomebrewでインストールできます。

$ brew install jq

以下のコマンドを実行してください。

$ cat news_crawl.jl | jq .

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages