【Python】Yahoo!ニュースをクローリングする

 

こんにちは。のっくん(@yamagablog)です。

 

今日の記事ではScrapyを使ってヤフーニュースをクローリングする方法をご紹介します。

 

男の子
クローリング?Scrapy?なんだか難しそうだなぁ。。。
のっくん
大丈夫。Scrapyは基本的な機能を全部提供してくれるので、使う方は大まかな内容を書くだけでいいんだよ。

 

スポンサーリンク

 

始める前に

 

まず開発環境ですがMacです。途中でMacのコマンドを使って作業しています。Windowsでも同じようにできるかも知れませんが、その場合は適宜置き換えて理解してください。

 

開発環境

・MacBook Pro 13 inch
・Anaconda
・Python 3.6

 

Scrapyのプロジェクトを作成する

 

クローリングにはscrapyを使います。scrapyはクロールをするためのフレームワークです。

 

プロジェクトを作成してその中でクロールするコードを書いていきます。プロジェクトを作成するところはDjangoなどのフレームワークと同じです。

 

私はAnacondaユーザなのでAnacondaナビゲータを使って、Scrapyをインストールしました。(もちろん、pipでもインストール可能です。)

 

Scrapyをインストールしたら、以下のコマンドでプロジェクトを作ります。

 

 

プロジェクトの構成は以下の通り。

 

 

settings.pyに以下の1行を追加して、ページのダウンロード間隔を1秒空けます。

 

 

itemの作成

 

itemはデータを格納するためのオブジェクトです。Djangoでいうmodelと同じです。

 

記事のタイトルと内容を格納するフィールドを以下のように定義します。

 

 

Spiderの作成

 

以下のコマンドで、Spiderを作成します。第一引数にはSpiderの名前、第二引数にはドメイン名を指定します。プロジェクトのルートディレクトリでコマンドを実行してください。

 

 

実行すると、spidersディレクトリの中にnews.pyができます。ここにコードを追記していきます。

 

各記事のリンクの抽出

 

まずはトップページにある各記事へのリンクを取得してみましょう。

 

news.py

 

このparseの処理ですがCSSセレクタを使ってHTMLのタグやクラスを指定しています。タグやクラス名はサイトの作成者が変更する場合があるので自分で確認するのが良いです。

 

URLに関しては、aタグのhrefの中にあるのでそれも一緒に指定してます。

 

 

私はChromeの開発者ツールを使って確認しました。

 

Chromeの開発者ツールとは:
他のウェブサイトのコードをチェックできるツールです。詳しい使い方は以下のページを見て下さい。
https://saruwakakun.com/html-css/basic/chrome-dev-tool

 

以下のコマンドでクロールを開始します。

 

 

 

上のように記事のリンクがリストで返ってきたら成功です。(そのままだと見にくいので手動で改行してます。)

 

クロールする

 

次に、各記事のタイトルの内容を集めてきて保存するコードを書いていきます。

 

記事へのリンクを見ると、

 

‘https://news.yahoo.co.jp/pickup/6306069’

 

のようになってます。

 

/pickup/数字列

 

が含まれたリンクだけ取り出したいです。この数字列の表現ですが正規表現にすると、

 

任意の数字が一回以上出現する

 

ってことになります。任意の数字は「\d」,一回以上は「+」,文字列の末尾は「$」で表します。

 

 

のっくん
バックスラッシュは、macだと「option」+「¥」で入力できるよ。

 

最初に「r」がついてるのは、バックスラッシュがエスケープ文字として判定されるのを防ぐためです。raw文字列と呼ばれます。

 

これを踏まえて、コードを書くと以下のようになります。

 

 

reで切り取ったurlは”/pickup/6306069″になりますので、urljoinでドメインをつけてフルパス”https://news.yahoo.co.jp/pickup/6306069″にしています。

 

parse_topicsでは各記事のタイトルと内容を取得しています。ここでもCSSセレクタが使われていますね。

 

Chromeの開発者ツールでタグを見てみましょう。

 

 

 

 

newsTitleとhbodyを指定すれば良いことがわかりました。::textが無いとタグも一緒に集めてきてしまうので指定しましょう。

 

クローリングした結果はJson Lines(.jl)形式で保存します。

 

 

catでファイルの内容を表示します。その際に日本語がエスケープされてしまいますが、jqコマンドを使うと日本語が見れます。

 

jqコマンドとは:
JSONを取り扱うツールです。macの場合はbrewでインストールできます。
https://stedolan.github.io/jq/

 

参考

 

「Python クローリング&スクレイピング」

 

 

以上です。お疲れ様でした。

ABOUTこの記事をかいた人

のっくん

理系院卒で大企業の研究所に就職。 趣味はプログラミング、レアジョブ英会話、筋トレ、旅行。 Twitter:@yamagablog