「シゴトがはかどる Python自動処理の教科書」を雑に試す

IT系の職業についたのは良いものの全く実装能力がない事が悩み。
正月休みで時間もあるので、「**シゴトがはかどる Python自動処理の教科書**」を読んで自動処理方法などなど学んでいきたい。

著作権的にアレなので、雑に自分で試したものだけを載せていきます。
(Qiitaに投稿お試し記事なので、読んでもあんまり役には立たない🙇)

# 使った書籍
https://www.amazon.co.jp/%E3%82%B7%E3%82%B4%E3%83%88%E3%81%8C%E3%81%AF%E3%81%8B%E3%81%A9%E3%82%8B-Python%E8%87%AA%E5%8B%95%E5%87%A6%E7%90%86%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA/dp/4839973857

過去何回もPythonとやらをいじった事があったけど、途中でめんどくさくなってやめてしまった。
その反省を活かし、今回は「自動処理」のゴールが明確な書籍を選ぶ。

# 構築環境

https://ai-inter1.com/python-vscode/

Windows11×VSCodeで。
公式サイト経由でPythonをインストールしても何故かうまくいかなかったので、Microsoft Store経由でインストールした。
パス設定とかの問題かな？

# Excel作業の自動化

一章はあってないようなものなので飛ばした。
PythonでExcelの操作をするためには、**openpyxl**というライブラリが有用だそう。
知らなかった。

#### 30×30の表をExcelに書き込む
```python
import openpyxl  

book = openpyxl.Workbook()
sheet = book.active

#連続でセルを設定する
for y in range(1,31):
    for x in range(1,31):
        #セルを取得して値を設定
        cell = sheet.cell(y,x)
        cell.value = y*x
        
#ファイルを保存
book.save("30×30.xlsx")
}
```
結果は↓
いい感じ...！
<img width="400" alt="image.pngf" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895709/f8806b92-df48-f52d-f0b6-7bbf51748272.png">

# Excelファイルとの連携

Excelの自動化操作により、売上データから顧客ごとの請求書を作成するなど高度な作業も可能になるみたい。

続いて気になったのはExcelとWordの連携。
「pip install python-docx」でモジュールをインストールする事でdocxファイルの操作が可能になる。

#### wordファイルの読み込み・保存
```python
import docx

#既存のwordファイルの読み込み
doc = docx.Document('test.docx')

#ファイルの保存
doc = docx.save('save_file.docx')
```

これをopenpyxlと同時に用いる事で、Excelの顧客名簿をもとにWordの案内状を作成する事もできる。

だけどExcelファイルをPDFファイルなどに変換して出力したい場合には、「pip install pywin32」でモジュールをインストールする必要があるみたい。

#### ExcelファイルをPDFとしてエクスポート
```Python
#pywin32など読み込み
import win32com.client as cli
import os

#保存先は絶対パスで指定
scr_file = os.path.abspath(__file__)
scr_dir = os.path.dirname(scr_file)
excel_file = scr_dir+'/savePywin32.xlsx'
pdf_file = scr_dir+'/pdfPywin32.pdf'

#Excel起動
app = cli.Dispatch("Excel.Application")
app.Visible = True
app.DisplayAlerts = False

book = app.Workbooks.Add()
sheet = book.ActiveSheet

sheet.Range("A1").value = "Qiita最初の投稿で緊張してます"

#Excelファイル保存
book.SaveAs(excel_file)

#PDFファイル保存
xlTypePDF = 0 #PDFを表す定数
book.ExportAsFixedFormat(xlTypePDF,pdf_file)

#Excel終了
app.Quit()
```

↓こんな感じでちゃんとPDFファイルが保存される。
<img width="400" alt="image.pngf" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895709/578621ef-c1ec-edd5-3566-c63893d8f0e4.png">

# Webページとの連携

ExcelやWordだけでなく、Webページとの連携によりさらに高度な連携もできるようになる。
アクセスしたいページのスクショくらいは簡単に自動化できる。

#### スクリーンショット
```Python
from selenium import webdriver

# Chromeを起動する
driver = webdriver.Chrome()
# Qiitaのページを開く
driver.get('https://qiita.com/')
# スクリーンショット撮影
driver.save_screenshot('screenshot.png')
driver.quit()
```
↓スクショ成功！
<img width="400" alt="image.pngf" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895709/282f87ac-ab95-40fd-3edb-dc11dd23507a.png">

#### Webスクレイピング
Web上のHTMLから情報を抜き出す**スクレイピング**と呼ばれる手法があるみたい。
出来たら滅茶苦茶便利なので、とりあえずYahooのトップニュースを抜き出す事を目標に頑張ってみた。
```Python
import requests,re
from bs4 import BeautifulSoup

#Yahooニュースにアクセス
target_url = 'https://news.yahoo.co.jp/'

def pickup_yahoo_news():
    #yahooニュースのHTML取得
    res = requests.get(target_url)
    #HTMLを解析
    soup = BeautifulSoup(res.text, "html.parser")
    #ピックアップニュースのみを表示
    articles = soup.find_all(href=re.compile("news.yahoo.co.jp/pickup"))
    for article in articles:
        print(article.contents[0])
    
if __name__ == '__main__':
    pickup_yahoo_news()
```

↓プログラムの実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895709/964dd070-43c0-8a53-0e07-49548b965962.png)

Yahooニュースはちゃんと抜き出せてる。
<img width="350" alt="image.pngf" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895709/e2dd7d33-d611-9070-24ce-7a7734f53e0d.png">
引用元：https://news.yahoo.co.jp/


# SNSとの連携
APIを取得すれば、LINEやTwitterとの連携も可能になるようです。

#### LINEで記念日を通知するプログラム
下みたいな記事を参考にして、アクセストークンをゲットしトークグループに**LINE Notify**を入れれば、
同じトークグループにPythonで作成したお知らせを通知したりできる。

https://www.smilevision.co.jp/blog/tsukatte01/

僕は「結婚した日」とかを設定すると、月ごとに記念日をお知らせしてくれるプログラムをつくってみました。
（実用性はない）
↓記念日になるとこんなのが送信される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895709/9c16aafd-2301-786d-df43-d6e1e4a5b1d0.png)

プログラムはこちら。
```Python
import requests
from datetime import datetime,timedelta
from dateutil.relativedelta import relativedelta

# アクセストークンを設定
acc_token = '***ここにアクセストークンを設定***'
# 〇日前から知らせとく
prenotify_day = 〇
# 記念日を設定
anniversary = datetime(2020,〇,〇)
    
def send_time():
    # サーバーに送るパラメータを用意
    url = 'https://notify-api.line.me/api/notify'
    headers = {'Authorization': 'Bearer ' + acc_token}
    # 日数を計算
    now = datetime.now()
    delta_anv = now - anniversary
    # 次の記念日まで何日か
    if now.day > anniversary.day:
        next_day = (now + relativedelta(months=1)).replace(day=anniversary.day)
    else:
        next_day = now.replace(day=anniversary.day)
    delta_next =  next_day - now
    
    # サーバーへ送信 
    # 当日の場合
    if delta_next.days == 0:
        msg = '\n記念日から'+ str(delta_anv.days+1)+'日経ちました。\n' + '今日は記念日です！'
        headers = {'Authorization': 'Bearer ' + acc_token}
        payload = {
          'message': msg,
          'stickerPackageId': 789,
          'stickerId': 10856,
        }
        requests.post(url, headers=headers, params=payload)
    # 当日以外の場合
    elif delta_next.days <= prenotify_day:
        msg = '\n記念日から'+ str(delta_anv.days+1)+'日経ちました\n' + next_day.strftime('%Y年%m月%d日') + 'まであと' + str(delta_next.days) + '日！'
        payload = {'message': msg}
        requests.post(url, headers=headers, params=payload)
    
   
if __name__ == '__main__':
    # メッセージを送信 
    send_time()
    print('ok')

```
# 終わりに
「シゴトがはかどる Python自動処理の教科書」を雑に試してみました。

基本を押さえつつ実用的な内容で、実業務に使う事がイメージできる良書だと思います。
結果、マウスやスクリーンショットの操作を自動化できたり、APIを使ってLINEに通知するbotを作る事ができました。

独学でPythonを学びたい方は、こういった「できること」に着目した本を使うことで飽きずに学習を進められるんじゃないかと思います。