スクレイピングした情報をgoogleカレンダーに反映

クラウドワークスで取得した案件をgoogleカレンダーに登録するプログラムです。

## 結果
![スクリーンショット 2023-06-02 18.17.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3331893/8e766876-3f17-64c9-fe1d-8b3e74ac7b8a.png)

指定したカレンダーIDのカレンダーにイベントを追加しています。

## コード

```
import requests
from bs4 import BeautifulSoup
import datetime
from google.oauth2 import service_account
from googleapiclient.discovery import build
import re
```
必要なライブラリのインストール。

```
索キーワードの入力
keyword = input("検索キーワードを入力してください: ")

# WebページのURL
url = "https://crowdworks.jp/public/jobs/search?keep_search_criteria=true&order=score&hide_expired=true&search%5Bkeywords%5D=" + keyword

# Webページの取得
response = requests.get(url)
html = response.text

# BeautifulSoupを使ってHTMLを解析
soup = BeautifulSoup(html, "html.parser")
```

入力したキーワードで案件を検索し、ページのhtmlを取得しています。

```
# イベント情報の取得（イベントの名前と日付を取得します）
event_name = soup.find('h3', class_='item_title').text
event_date = soup.find('span', class_='absolute_date').text
# '（6月3日まで）'という形式の日付データから日付部分を抽出
event_date = soup.find('span', class_='absolute_date').text
match = re.search(r'(\d+)月(\d+)日', event_date)
if match:
    month = int(match.group(1))
    day = int(match.group(2))

    # 年は現在の年とする（他の方法で取得することも可能）
    year = datetime.datetime.now().year

    # 日付をdatetimeオブジェクトに変換
    event_date = datetime.datetime(year, month, day)
```
タグとクラスから案件のタイトル、日付を取得し、日付は使えるようにdatetimeオブジェクトに変換。

```
  event_body = {
        'summary': event_name,
        'start': {
            'dateTime': event_date.isoformat(),
            'timeZone': 'Asia/Tokyo',
        },
        'end': {
            'dateTime': (event_date + datetime.timedelta(hours=1)).isoformat(),
            'timeZone': 'Asia/Tokyo',
        },
    }
```
 カレンダーに反映させるevent_bodyオブジェクトを作成。


```
# Google Calendar APIの設定
SCOPES = ['https://www.googleapis.com/auth/calendar']
SERVICE_ACCOUNT_FILE = 'service_account.json' 
```
google calendarのAPIの認証情報を保存。

```
credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = build('calendar', 'v3', credentials=credentials)
```
serviceオブジェクトを構築し、googleカレンダーをpythonで操作できるように。

```
service.events().insert(calendarId='primary', body=event_body).execute()
```
最後に、カレンダーにイベントを追加。


全体コード
```
#!/usr/bin/env python
# coding: utf-8

# In[1]:


import requests
from bs4 import BeautifulSoup
import datetime
from google.oauth2 import service_account
from googleapiclient.discovery import build
import re


# In[2]:


# 検索キーワードの入力
keyword = input("検索キーワードを入力してください: ")

# WebページのURL
url = "https://crowdworks.jp/public/jobs/search?keep_search_criteria=true&order=score&hide_expired=true&search%5Bkeywords%5D=" + keyword

# Webページの取得
response = requests.get(url)
html = response.text

# BeautifulSoupを使ってHTMLを解析
soup = BeautifulSoup(html, "html.parser")


# In[3]:


# イベント情報の取得（イベントの名前と日付を取得します）
event_name = soup.find('h3', class_='item_title').text
event_date = soup.find('span', class_='absolute_date').text
# '（6月3日まで）'という形式の日付データから日付部分を抽出
event_date = soup.find('span', class_='absolute_date').text
match = re.search(r'(\d+)月(\d+)日', event_date)
if match:
    month = int(match.group(1))
    day = int(match.group(2))

    # 年は現在の年とする（他の方法で取得することも可能）
    year = datetime.datetime.now().year

    # 日付をdatetimeオブジェクトに変換
    event_date = datetime.datetime(year, month, day)
    
    event_body = {
        'summary': event_name,
        'start': {
            'dateTime': event_date.isoformat(),
            'timeZone': 'Asia/Tokyo',
        },
        'end': {
            'dateTime': (event_date + datetime.timedelta(hours=1)).isoformat(),
            'timeZone': 'Asia/Tokyo',
        },
    }
    


# In[4]:


# Google Calendar APIの設定
SCOPES = ['https://www.googleapis.com/auth/calendar']
SERVICE_ACCOUNT_FILE = 'service_account.json' 


# In[5]:


credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = build('calendar', 'v3', credentials=credentials)


# In[6]:


service.events().insert(calendarId='primary', body=event_body).execute()


# In[ ]:

```