Node.js で Yahooニュース のTOPICリストをスクレイピングする

投稿日:2019年09月14日

Tags: Node.js JavaScript

下記Qiitaの記事を読んでNode.jsでウェブスクレイピングの楽しさに目覚めたので備忘録です。

Node.jsでウェブスクレイピングする色々な方法

2019/09/14時点でのYahooニュースをスクレイピングする想定で書いていますので、後日、ページの構成が変わった場合は正常に動作しない可能性がありますのでご留意ください。

開発環境

Node.js が入っている前提で話を進めます。
私の環境は下記です。

  • Node.js
    • v8.10.0
  • npm
    • v6.10.3
  • yarn
    • v1.17.3

スクレイピング用のjsを作成する

作業用の適当なディレクトリを作成し、スクレイピング用のスクリプトを記述するjsを作成します。

$ mkdir sample-scraping
$ cd sample-scraping
$ touch sample-scraping.js
1
2
3

必要なパッケージ

package.json を作成します。

$ yarn init -y
# or
$ npm init -y
1
2
3

package.json に下記を追加して yarn or npm i します。

moment.js は直接は必要ないですが、日付操作を楽にしたかったので入れておきます。

{
  "dependencies": {
    "jsdom": "^15.1.1",
    "moment": "^2.24.0",
    "request": "^2.88.0"
  }
}
1
2
3
4
5
6
7

または下記でインストールします。

$ yarn add jsdom moment request
# or
$ npm i jsdom moment request 
1
2
3

各種パッケージの読み込み

先ほど作成した sample-scraping.js にインストールしたパッケージを require します。

const request = require('request')
const { JSDOM } = require('jsdom')
const moment = require('moment')
// ファイル操作に必要なモジュール(Node.jsにデフォで入っているはずなので npm i しなくて良い)
const fs = require('fs')
1
2
3
4
5

日付のフォーマットとURLの設定

続いて日付のフォーマットと、スクレイピングするページのURLを設定します。

// ファイル名に使用する日付フォーマット
const today = moment().format('YYYY-MM-DD')
// YahooニュースのITカテゴリTOP
const url = 'https://news.yahoo.co.jp/categories/it'
1
2
3
4

スクレイピング用のスクリプト

各行の説明はコードにコメントを記載しましたので、ご確認ください。

request(url, (e, response, body) => {
  if (e) {
    console.error(e)
  }

  try {
    // 取得してきたニュースをのテキストを格納する変数
    let text = ''

    // リクエストで返ってきたDOM
    const dom = new JSDOM(body)

    // トピックリストのDOMを取得
    const topicsListItem = dom.window.document.querySelectorAll('.topicsListItem')

    // querySelectorAllの返り値はNodeListなのでforEachで回す
    topicsListItem.forEach(element => {
      const item = element.children[0] // 各ニュースを取得
      const news = {
        text: item.textContent.trim(), // ニュースのテキスト
        href: item.href  // ニュースのリンク先
      }

      // テキストとリンク先を結合し、文末に改行を入れる
      text += `${news.text} ${news.href}\n`
    })
    
    // YYYY-MM-DD_it_news.txt を作成し、テキストとリンクをファイルに書き込む
    fs.writeFileSync(`${today}_it_news.txt`, text)
  } catch (e) {
    console.error(e)
  }
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

スクリプトの実行方法

下記を叩いて、プロジェクトルートに YYYY-MM-DD_it_news.txt が生成されてニュースの見出しとリンクが出力されていたら成功です。

$ node sample-scraping.js
1

出力例

新iPhone 各社の価格出そろう https://news.yahoo.co.jp/pickup/6336455
5G未対応 中国でiPhone苦戦? https://news.yahoo.co.jp/pickup/6336316
龍が如く7 ハロワで勇者転職 https://news.yahoo.co.jp/pickup/6336476
桃鉄新作 大胆な刷新に困惑も https://news.yahoo.co.jp/pickup/6336365
千葉市長投稿「自粛遠慮を」 https://news.yahoo.co.jp/pickup/6336325
千葉で公衆電話無料 注意点は https://news.yahoo.co.jp/pickup/6336249
携帯値引き合戦 法令の穴突く https://news.yahoo.co.jp/pickup/6336346
イヤホン線路落下 JR注意喚起 https://news.yahoo.co.jp/pickup/6336312
1
2
3
4
5
6
7
8

まとめ

普段はjQueryでDOM操作したり、Vue書いたりなお仕事しているので、ちょっとだけサーバーサイドっぽいことしてみると凄い楽しかったです。

Node.js楽しいですね。

参考

  • シェア:
Last Updated: 2019-9-14 00:19:34