Diagonal M

データサイエンス系長期インターンで学んだことなど

【Python】簡単クローリング

今回はPythonにより最低限のモジュールでクローリングをしていきます。
使用するモジュール

import requests
import os
from time import sleep

クローリングで対象ページをhtmlファイルとして取得し、取得したhtmlファイルに対してスクレイピングをしていきます。今回はクローリング部分について書いていきます。

f:id:diagonal-m:20190619145622p:plain
日本経済新聞
青丸で囲ったカテゴリーごとに指定したページ数分のHTMLを取得し、最終的には記事タイトルと記事のカテゴリーを収集することを目指します。

クローラー作成の手順


  1. 各カテゴリーのページのURLがどのようになっているのかを確認する。
    経済・政治 : https://www.nikkei.com/economy/archive/
    ビジネス : https://www.nikkei.com/business/archive/
    テクノロジー : https://www.nikkei.com/technology/archive/
    国際・アジア : https://www.nikkei.com/international/archive/
    上の4つのURLを確認すると以下の部分が共通していることがわかります。 "https://www.nikkei.com/‥‥/archive/"
  2. ページごとのURLがどのようになっているのかを確認する。
    経済・政治のページで1ページ目、2ページ目、3ページ目のURLがどのように変化しているのかを確認する。
    1ページ目 : https://www.nikkei.com/economy/archive/https://www.nikkei.com/economy/archive/?bn=01でも同ページが表示される)
    2ページ目 : https://www.nikkei.com/economy/archive/?bn=11
    3ページ目 : https://www.nikkei.com/economy/archive/?bn=21
    ?bn=に続く数字を変えていけば各ページのHTMLを取得することができそうです。

クローリングの実装


# htmlを格納するディレクトリを作成
file_path = 'nikkei'
if not os.path.exists(file_path):
    os.makedirs(file_path)

# 共通URL
url_org = 'https://www.nikkei.com'

# 政治・経済/ビジネス/テクノロジー/国際・アジア
archive_list = ['economy', 'business', 'technology', 'international']

page = 0
for archive in archive_list:
    for _ in range(3):
        response = requests.get(url_org + '/' + archive + '/' + 'archive/' + \  
                    '?bn=' + str(page) + '1')
        response.encoding = response.apparent_encoding
        # nikkeiディレクトリにpage〇.htmlで保存
        with open(os.path.join('nikkei', 'page' + str(page + 1) + '.html'), 'w', \                   encoding = 'utf-8') as f:
            f.write(response.text)
            page = page + 1
            sleep(1)
  • if not os.path.exists(file_path):file_path(ディレクトリ名)同名のディレクトリが存在しないとき。

  • os.makedirs(file_path)<file_path>ディレクトリを作成する。

  • for archive in archive_list:でカテゴリーごとにfor文を回す。

  • for _ in range(3):カテゴリーごとに3ページずつ取得

  • requests.get(url_org + '/' + archive + '/' + 'archive/' + '?bn=' + str(page) + '1') でカテゴリー、ページごとのURLのHTMLを取得する。

  • response.encoding = response.apparent_encodingで極力文字化けが起こらないようにできる。

取得したhtmlを最初に作成したnikkeiディレクトリにpage〇.htmlで保存する。

f:id:diagonal-m:20190619153353p:plain
nikkeiディレクト
4カテゴリー3ページずつHTMLファイルが保存されている。

まとめ

webページのURLがどのように構成されているかを確認することができればこのようなページ移動のみで達成できるものであれば簡単につくることができます。
 次回は取得したHTMLをスクレイピングして記事タイトル等を取得していきます。