【Python】簡単スクレイピング
今回は前回収集した日系電子版のホームページのHTMLから記事タイトルとその記事のカテゴリーを収集します。
成果物イメージ
ジャンル | タイトル |
---|---|
ネット・IT | Tモバイル-スプリント統合に米司法省が示す懸念 |
ネット・IT | 中国ネット通販2位・京東、廉売合戦で体力失う |
AI | 日立、人工知能を使った工場向けセキュリティー技術 |
上表のようにジャンルと記事タイトルを一対で収集することを最終的に目指します。
使用するモジュール
import requests from bs4 import BeautifulSoup import csv import os
スクレイピングの手順
- webページがどのように構成されてるかをみる。
記事タイトルにカーソルを合わせて右クリックで一番下にある検証をクリックします。
すると画像右のようなページがどうように構成されているかが表示されます。
拡大すると 記事タイトルは
<span class="class_ = 'm-miM09_titleL'> </span>
で囲まれていることがわかります。
スクレイピングの実装
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)
上コードを実行すると見ずらいですが以下のような結果を得ることができます。
かなりおおざっぱですがこれで集めたいデータを無事集めることができました。
スクレイピング部分についてはいずれ細かく見ていきたいと思います。