Diagonal M

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

【Python】簡単スクレイピング

今回は前回収集した日系電子版のホームページのHTMLから記事タイトルとその記事のカテゴリーを収集します。

成果物イメージ

ジャンル タイトル
ネット・IT Tモバイル-スプリント統合に米司法省が示す懸念
ネット・IT 中国ネット通販2位・京東、廉売合戦で体力失う
AI 日立、人工知能を使った工場向けセキュリティー技術

上表のようにジャンルと記事タイトルを一対で収集することを最終的に目指します。

使用するモジュール

import requests
from bs4 import BeautifulSoup
import csv
import os

スクレイピングの手順

  1. webページがどのように構成されてるかをみる。

f:id:diagonal-m:20190718172357p:plain

 記事タイトルにカーソルを合わせて右クリックで一番下にある検証をクリックします。

 すると画像右のようなページがどうように構成されているかが表示されます。

 拡大すると f:id:diagonal-m:20190718172425p:plain 記事タイトルは

<span class="class_ = 'm-miM09_titleL'> </span>

で囲まれていることがわかります。

スクレイピングの実装

pythonスクレイピングの実装をしていきます。

nikkei = [] # 記事ジャンル、記事タイトルの空のリスト

# htmlファイルの総数(ループ回数)
num = len(os.listdir('nikkei'))

記事ジャンル、タイトルを格納する空のリストをつくります。

nikkeiフォルダ内のhtmlファイル数をループの回数としてnumに代入します。

# スクレイピング
page = 1
for _ in range(num):
    filepath = os.path.join('nikkei', 'page' + str(page) + '.html')
    with open(filepath , encoding = 'utf-8') as f:
        html = f.read()
        soup = BeautifulSoup(html, "html.parser")
        page = page + 1

        nikkei_list = soup.find_all('div', class_ = 'm-miM09', reversed=False)

        for kiji in nikkei_list:

            title = kiji.find('span', class_ = 'm-miM09_titleL')
            title_text = title.text

            junle_list = kiji.find_all('div', class_ = 'm-miM09_keyword', reversed=False)

            for junle in junle_list:
                junle = junle.find('a')
                if junle == None:
                    keyword = '未分類'
                else:
                    keyword = junle.text

                nikkei.append([keyword, title_text])

with open('nikkei.txt','w',encoding = "utf-8") as f:
    writer = csv.writer(f, lineterminator = "\n")
    writer.writerows([['ジャンル','タイトル']])
    writer.writerows(nikkei)

上コードを実行すると見ずらいですが以下のような結果を得ることができます。

f:id:diagonal-m:20190718172455p:plain

かなりおおざっぱですがこれで集めたいデータを無事集めることができました。

スクレイピング部分についてはいずれ細かく見ていきたいと思います。