【Python】WebデータをExcel上に自動収集・整理する方法|スクレイピングを応用した自動化ツール紹介

当ページには広告が含まれています。

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

インターネット上でトレンド調査した情報をExcelレポートとして自動出力する方法について解説します。プログラム言語はPythonを用い、Webスクレイピング技術によるweb上情報収集、OpenPyXLモジュール活用によるExcelレポート作成ライブラリを用いて実現します。

目次

【RPAツール概要】Webトレンド情報収集・レポート自動作成

本記事では、Web上での情報収集を行なった後、Excelレポート作成に至るまでの作業プロセスを自動することを目的としたツールの作成方法について解説します。

例として、ニュースサイト情報を収集し、Excelファイル形式のレポートを出力するツールをご紹介します。

以下の30秒動画でもRPAツールの概要を詳しく紹介しています。

主要技術としては、主にWebスクレイピングExcelレポーティングの2つを用いています。

【Python】Webスクレイピング

Webスクレイピング(Web Scraping)とは、WebサイトのHTMLからデータを抽出する技術を指します。スクレイピングをもとに、短時間で大量のWebデータ収集が実現できます。

Webスクレイピングについてもっと詳しく知りたい方向けにこちらの記事も配信しています。

【Python】Excel操作自動化・レポーティング

本記事でのExcelレポーティングとは、Pythonを用いて目的のExcelレポートを出力することを指します。

Pythonを用いてExcelを操作する方法について、どんなことができるのか詳しく知りたい方はこちらの記事をご覧下さい。

【RPA】Webスクレイピングに基づくExcelレポート作成

実際にPRAツール構築に際して「プログラム構築イメージ」と「Python環境準備事項」を事前に提示します。

プログラム動作イメージ

  • Web上で最新ニュース記事のタイトル・概要・記事リンクを取得
  • 取得情報をデータ処理・Excelに表形式で出力
  • コロナ関連記事は強調ハイライトして表示

【事前準備】Pythonライブラリのインストール

BeautifulSoup4

Webスクレイピングには、Beautiful Soup4というWebサイトを構築するHTMLやXMLを取得するPythonモジュールを用いています。インストール未済の場合は、以下コマンド入力によってインストールしておきましょう!

pip install beautifulsoup4

OpenPyXL

PythonによるExcel操作には、OpenPyXLというモジュールを用いています。インストール未済の場合は、以下コマンド入力によってインストールします。

pip install openpyxl

【参考】おすすめ教材|Pythonで作業を効率化したい方向け

Pythonを用いて面倒な作業を自動化したい方向けに、おすすめの教材をご紹介します。

【Pythonコード公開】BeautifulSoup4・OpenPyXL

下記のPythonプログラムによって本記事で紹介しているツールは動作しています。コピー&ペーストにてご利用可能です。

また、使用用途に応じてWeb情報取得対象やExcelレポート記載方法をカスタマイズすることで、多様な業務の自動化を実現するRPAツールとしても活用できるかと思われます。


import pandas as pd
from datetime        import date
from pandas          import Series
from bs4             import BeautifulSoup
from urllib.request  import urlopen

import openpyxl
from openpyxl.styles         import Font
from openpyxl.styles.borders import Border, Side

# =====================================================
# Web Scraping
# =====================================================
def get_trend():
    # data
    title_list    = []
    contents_list = []
    url_list      = []

    # HTML
    url = urlopen("https://www.nikkei.com")
    html = BeautifulSoup(url, "html.parser")

    # elements
    get_elements = html.find_all("div", {"class":"block_bch8brg"})

    for i in range(len(get_elements)):
        title  = get_elements[i].find("article",{"class":"card_c1g19z31"}).find_all(text = True)
        titles = ""
        for item in range(len(title)):
            titles += title[item]
        title_list.append(titles)

        link = "https://www.nikkei.com/" + get_elements[i].find("article",{"class":"card_c1g19z31"}).find("a",{"class":"fauxBlockLink_fs5hi1o"}).get("href")
        url_list.append(link)

    # Pandas
    table = pd.DataFrame()
    table["Title"] = title_list
    table["URL"]   = url_list
    
    return table

# =====================================================
# Excel Reporting
# =====================================================
class excel_report:
    
    def __init__(self,file_name,sheet_name):
        self.file_name = file_name
        self.sheet_name = sheet_name
        
    # Create workbook and sheet
    def create_workbook_sheet(self):
        name     = self.file_name + ".xlsx"
        workbook = openpyxl.Workbook(name)
        sheet1   = workbook.create_sheet(index=0,title=self.sheet_name)
        workbook.save(name)  

    # Edit sheet
    def edit_sheet(self):
        # =============================================
        # select workbook & sheet
        # =============================================
        name          = self.file_name + ".xlsx"
        workbook      = openpyxl.load_workbook(name)
        select_sheet1 = workbook.get_sheet_by_name(self.sheet_name)
        select_sheet1.sheet_properties.tabColor = '008000'
        # =============================================
        # Design Setting
        # =============================================
        # Font
        font_meiryo      = Font(size=14,name="Meiryo UI")
        # Background
        backbround       = openpyxl.styles.PatternFill(patternType='solid',start_color='FFFFFF', end_color='FFFFFF')
        backbround_table = openpyxl.styles.PatternFill(patternType='solid',start_color='0000CD', end_color='0000CD')
        backbround_logic = openpyxl.styles.PatternFill(patternType='solid',start_color='00FFFF', end_color='00FFFF')
        for i in range(50):
            for j in range(200):
                select_sheet1.cell(row=j+1,column=i+1).font = font_meiryo
                select_sheet1.cell(row=j+1,column=i+1).fill = backbround
        # Border
        side   = Side(style='thin', color='000000')
        border = Border(top=side, bottom=side, left=side, right=side)

        # Font Color
        font_color     = Font(size=14,color='FFFFFF')
        font_color_url = Font(size=14,color="0000FF")

        # Height and Width
        select_sheet1.row_dimensions[1].height = 30
        select_sheet1.row_dimensions[2].height = 10
        select_sheet1.column_dimensions["A"].width = 3
        select_sheet1.column_dimensions["B"].width = 5
        select_sheet1.column_dimensions["C"].width = 16
        select_sheet1.column_dimensions["D"].width = 140
        select_sheet1.column_dimensions["E"].width = 8

        # Marge Cell
        select_sheet1.merge_cells("B1:D1")
        
        
        # =============================================
        # edit sheet
        # =============================================
        select_sheet1["B1"]      = "最新ニュースまとめ"
        select_sheet1["B1"].font = Font(size=18,bold=True, italic=True, color='FF0000', underline='single')
        select_sheet1["B3"]      = "#"
        select_sheet1["C3"]      = "日付"
        select_sheet1["D3"]      = "タイトル"
        select_sheet1["E3"]      = "リンク"
        select_sheet1["B"+str(len(news_data)+5)] = "※コロナ関連の最新ニュースをハイライトで表示します。"

        columns = ["B","C","D","E"]
        for i in range(len(news_data)):
            # Data
            select_sheet1["B"+str(4+i)] = i + 1
            select_sheet1["B"+str(4+i)] = i + 1
            select_sheet1["C"+str(4+i)] = str(date.today())
            select_sheet1["D"+str(4+i)] = news_data["Title"][i]
            select_sheet1["E"+str(4+i)] = "GO"
            select_sheet1["E"+str(4+i)].hyperlink = news_data["URL"][i]

            # Design
            for j in range(len(columns)):
                # background
                select_sheet1[columns[j] + str(3)].fill = backbround_table
                # Border
                select_sheet1[columns[j] + str(3+i)].border = border
                select_sheet1[columns[j] + str(4+i)].border = border
                # font
                select_sheet1[columns[j]+str(3)].font= font_color
                select_sheet1["E"+str(4+i)].font= font_color_url
                
            # Business Logic
            if ("コロナ" in select_sheet1["D"+str(4+i)].value) or ("ワクチン" in select_sheet1["D"+str(4+i)].value):
                    for k in range(len(columns)):
                        select_sheet1[columns[k]+str(4+i)].fill = backbround_logic

        # save
        workbook.save(name)
        

        
# =====================================================
# 実行
# =====================================================
# Execute Scraping
news_data = get_trend()

# Execute Reporting
file_name  = "最新ニュース抜粋"
sheet_name = "ニュース一覧"

# create Excelfile
create = excel_report(file_name,sheet_name).create_workbook_sheet()
edit   = excel_report(file_name,sheet_name).edit_sheet()

【参考】Pythonで面倒な作業を自動化!手法一挙公開中!

当サイトでは日々面倒な作業をPythonで自動化する方法を多数配信しております。日々の作業が飛躍的効率化できること間違いなしですので、以下気になった記事があれば併せてご覧ください。

【面倒なタスクをPythonで解決!】作業効率化の人気記事一覧




【参考】Pythonとは?・実現できること

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次