Google Cloud Function に ターミナルからデプロイ

【1】概要

◆背景

・以下の様にコードと共に認証用のファイルが入ったフォルダをアップロードしたいが通常通りの関数作成ではこのようにできない。
・ターミナルからならできるようなので実際にやってみる

GCFスクショ1
GCFスクショ1

◆やりたいこと

・ターミナルから複数ファイル(コードと共に認証用のファイルが入ったフォルダ)をGCFにデプロイする

【2】内容

◆コード全文

cd {対象のファイルが入っているフォルダまで移動}
gcloud functions deploy {デプロイしたい関数名} --runtime python39 --trigger-http --allow-unauthenticated --timeout=540

【3】補足

◆複数のプロジェクトを所持していてデプロイ先のプロジェクトを変更したい時

現在のプロジェクトがデプロイ先のプロジェクトとして設定されているか確認する

$ gcloud config list

[core]
account = *****@*****
disable_usage_reporting = True
project = [プロジェクト名]

もし意図したプロジェクトと違っていたら以下のコマンドで変更。

$ gcloud config set project [プロジェクト名]

◆2023/11/15追記

久々に実施したら以下のようなエラーが発生した。

(gcloud.functions.deploy) There was a problem refreshing your current auth tokens: ('invalid_grant: Token has been expired or revoked.', {'error': 'invalid_grant', 'error_description': 'Token has been expired or revoked.'})


以下のコマンドでログインしたら解決した。

gcloud auth login

【Python】SeleniumでログインしCSVダウンロード&そのCSVをPandasで加工してBigQueryに転送

【1】概要

◆背景

・毎日決まったところからCSVを落とし、BigQueryに転送する処理をしたい。

◆やりたいこと

Seleniumを使用し、あるサイトにログインしてCSVをダウンロードする。
・ダウンロードしたファイルをPandasで加工し、BigQueryに転送。

【2】内容

◆コード全文

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd
from datetime import datetime as dt, timedelta
import datetime
from webdriver_manager.chrome import ChromeDriverManager
import os
from google.cloud import bigquery

os.getcwd()

#フォルダ指定
default_folder_name = "{ファルダパス}"
os.chdir(default_folder_name)

#日付指定
tdatetime = dt.now()
date_nonhyphen = tdatetime.strftime('%Y%m%d')
date_hyphen = tdatetime.strftime('%Y-%m-%d')
time_str = tdatetime.strftime('%Y-%m-%d %H:%M:%S')

#Seleniumを使うための設定とログインしたい画面への遷移
URL = "{ログインしたいサイトのURL}"
driver_path = "./chromedriver"
driver = webdriver.Chrome(ChromeDriverManager().install())
#driver = webdriver.Chrome()
driver.maximize_window()
time.sleep(2.5)
driver.get(URL)
time.sleep(2.5)

# emailをクリックする(ここの指定はサイトによって変わる)
email_btn = driver.find_element(By.NAME,'email')
email_btn.click()
# 1秒待機
time.sleep(1)
# emailを入力
email_btn.send_keys("{ログインに必要なemail}")
# 1秒待機
time.sleep(1)

# パスワードをクリック(ここの指定はサイトによって変わる)
password_btn = driver.find_element(By.NAME,'password')
password_btn.click()

# パスワードを入力
password_btn.send_keys("{ログインに必要なPassword}")

# 1秒待機
time.sleep(1)

# サブミットをクリックしログイン、これでログインできる
login_btn = driver.find_element(By.NAME,'submit')
login_btn.click()

#ファイルをdownload
posts_download_url = "{ダウンロードURL}"
driver.get(posts_download_url)

#30秒待機
time.sleep(30)

# ブラウザを終了する。
driver.close()

#ファイル名指定
file_name = "{ダウンロードされるファイルのCSV名}"

#ダウンロードフォルダ指定
key="HOME"
folder = os.getenv(key)
print(folder)
folder_name = folder+"/Downloads"

os.getcwd()
os.chdir(folder_name)

#CSVをダウンロード
df = pd.read_csv(file_name)

#日時列を追加
df["uploaded_at"] = time_str

#最初のフォルダに戻る
os.chdir(default_folder_name)

#GCPの設定
GCP_PROJECT_NAME = "{GCPのプロジェクト名}"

os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = '{GCPの認証ファイルの場所}'

# bigQueryクライアント認証
client = bigquery.Client(project=GCP_PROJECT_NAME)

#BQにアップロード
df.to_gbq("{テーブル名}"+date_nonhyphen,if_exists="replace")

【3】補足

◆コード補足

●chromedriverの更新が必要

通常だと更新が必要だが、ChromeDriverManagerのモジュールを使用することで更新不要になる。

driver = webdriver.Chrome() #更新必要
driver = webdriver.Chrome(ChromeDriverManager().install()) #更新不要

【Python】SeleniumでGoogleの検索結果をリストとして抽出

【1】概要

◆背景

SEO用にKW別のGoogleでの検索結果順位を出したい時に作成

◆やりたいこと

Googleの検索結果のリストをSeleniumスクレイピングCSVでダウンロードする

【2】内容

◆コード全文

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
#from selenium.webdriver.common.keys import Keys
import pandas as pd
import tqdm
import datetime

#Seleniumを使うための設定とgoogleの画面への遷移
MIN_INTERVAL = 0.5
INTERVAL = 2.5
MINUTE_INTERVAL = 60.0
URL = "https://www.google.com/"
driver_path = "./chromedriver"
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.maximize_window()
time.sleep(INTERVAL)
driver.get(URL)
time.sleep(INTERVAL)

#googleで検索する文字をリスト化
search_string = ['味噌 スープ','しいたけ キャベツ']

#results = None
concat_df = None 
result_df = None 

for query_string in tqdm.tqdm(search_string):
    
    ## フォームに入っている情報を削除
    driver.find_element(By.NAME,'q').clear()

    ## 検索ワードを送信する
    driver.find_element(By.NAME,'q').send_keys(query_string)

    # 検索を実行
    driver.find_element(By.NAME,'q').submit()

    # 待機
    time.sleep(INTERVAL)

    #検索結果の一覧を取得する
    results = []
    flag = False
    while True:

        #g_aryは検索結果のタイトルとURLが入った要素をリストで保持
        g_ary = driver.find_elements(By.CLASS_NAME,'g')
        #print(g_ary)
        
        #title = driver.title
        #url = driver.get(url)
        for g in g_ary:
            result = {}
            #YOUTUBEのときだけ場合わけ、それ以外はスキップ(Wiki等)
            try:
                result['url'] = g.find_element(By.CLASS_NAME,'yuRUbf').find_element(By.TAG_NAME,'a').get_attribute('href')
            except: #YOUTUBE
                try:
                    result['url'] = g.find_element(By.CLASS_NAME,'ct3b9e').find_element(By.TAG_NAME,'a').get_attribute('href')
                except: #Wiki等
                    break
            result['title'] = g.find_element(By.TAG_NAME,'h3').text
            results.append(result)
            if len(results) >= 20:#抽出する件数を指定
                flag = True
                break
        if flag:
            break

        #次のページへ
        driver.find_element(By.ID,'pnnext').click()

        #time.sleep(INTERVAL)


    #pandasでデータフレーム化
    result_df = pd.DataFrame(results)
    result_df.reset_index(inplace=True)
    result_df = result_df.rename(columns={'index': 'rownum'})
    result_df['rownum'] = result_df['rownum'] + 1
    result_df['query'] = query_string

    concat_df = pd.concat([result_df,concat_df], axis=0)
    
    time.sleep(MINUTE_INTERVAL)

concat_df['domain'] = concat_df['url'].str.extract('://([^/]+).*', expand=True)

#今日の日付でCSV保存
now = datetime.datetime.today()
date = str(now.strftime("%y%m%d"))
concat_df.to_csv("keyword_rank_list_"+ date +".csv", encoding="utf-8")

◆アウトプットイメージ

rownum url title query domain
0 1 https://www.kurashiru.com/lists/2cf9bf31-58f6-47d2-8823-a8b12268b01e キャベツしいたけのレシピ おすすめの30選を紹介 - クラシル しいたけ キャベツ www.kurashiru.com
1 2 https://delishkitchen.tv/recipes/347219825501668370 しいたけとキャベツのしょうが炒め - DELISH KITCHEN しいたけ キャベツ delishkitchen.tv
2 3 https://delishkitchen.tv/recipes/349664908406686814 キャベツとしいたけのバター醤油炒め - DELISH KITCHEN しいたけ キャベツ delishkitchen.tv
3 4 https://park.ajinomoto.co.jp/recipe/search/?search_word=%E3%82%AD%E3%83%A3%E3%83%99%E3%83%84+%E3%81%97%E3%81%84%E3%81%9F%E3%81%91 「キャベツ しいたけ」の人気レシピ 44件 - AJINOMOTO Park しいたけ キャベツ park.ajinomoto.co.jp
4 5 https://cookpad.com/search/%E3%81%97%E3%81%84%E3%81%9F%E3%81%91%20%E3%82%AD%E3%83%A3%E3%83%99%E3%83%84 みんなの「しいたけ キャベツ」レシピが6710品 - クックパッド しいたけ キャベツ cookpad.com
5 6 https://recipe.rakuten.co.jp/recipe/1900008228/ キャベツとしいたけの塩昆布炒め レシピ・作り方 by fish.on しいたけ キャベツ recipe.rakuten.co.jp
6 7 https://www.kyounoryouri.jp/search/recipe?keyword=%E3%82%AD%E3%83%A3%E3%83%99%E3%83%84+%E3%81%97%E3%81%84%E3%81%9F%E3%81%91 「キャベツ」「しいたけ」 人気レシピ - みんなのきょうの料理 しいたけ キャベツ www.kyounoryouri.jp
7 8 https://www.marukome.co.jp/recipe/detail/ekimiso_225/ 春キャベツとしいたけのみそ汁|レシピ - マルコメ しいたけ キャベツ www.marukome.co.jp
8 9 https://macaro-ni.jp/116526 冷蔵庫に余ってない?しいたけとキャベツのおすすめレシピ10選 しいたけ キャベツ macaro-ni.jp
9 10 https://www.lettuceclub.net/recipe/dish/32657/ キャベツとしいたけのカレーポン酢あえ - レタスクラブ しいたけ キャベツ www.lettuceclub.net
10 11 https://oceans-nadia.com/user/20995/recipe/252642 肉なしでも満足*キャベツとしいたけの卵とじで一汁一菜 しいたけ キャベツ oceans-nadia.com
11 12 https://www.mizkan.co.jp/ouchirecipe/recipe/?menu_id=9206 鶏肉とキャベツ・しいたけの春雨酢っぱスープ - ミツカン しいたけ キャベツ www.mizkan.co.jp
12 13 https://www.orangepage.net/recipes/detail_103529 鶏肉だんごとキャベツ、しいたけ、春雨のうま煮 しいたけ キャベツ www.orangepage.net
13 14 https://www.kikkoman.co.jp/homecook/search/recipe/00001056/index.html しいたけと野菜のかき卵汁のレシピ・つくり方 - キッコーマン しいたけ キャベツ www.kikkoman.co.jp
14 15 https://ainoouchigohan.blog.jp/archives/1070244901.html 朝食やおひとりさまランチにおすすめ 肉なしでも満足 ... しいたけ キャベツ ainoouchigohan.blog.jp
15 16 https://www.recipe-blog.jp/profile/313934/recipe/1420769 とっても簡単キャベツとしめじとしいたけ炒め(ヘルシー しいたけ キャベツ www.recipe-blog.jp
16 17 https://life.ja-group.jp/recipe/detail?id=3698 キャベツと鶏ハムとしいたけのスープ - JAグループ しいたけ キャベツ life.ja-group.jp
17 18 https://oishi-kenko.com/recipes/18884 キャベツとしいたけのコンソメスープ by おいしい健康 しいたけ キャベツ oishi-kenko.com
18 19 https://www.city.kitakyushu.lg.jp/san-kei/file_0387.html 3月の野菜(しいたけ、キャベツ等) - 北九州市 しいたけ キャベツ www.city.kitakyushu.lg.jp
19 20 https://tenshi-foodservice.net/696.html しいたけとキャベツのほっこりスープ - 天使の給食 しいたけ キャベツ tenshi-foodservice.net
0 1 https://park.ajinomoto.co.jp/recipe/search/?search_word=%E3%81%BF%E3%81%9D+%E3%82%B9%E3%83%BC%E3%83%97 「みそ スープ」の人気レシピ 80件 - AJINOMOTO Park 味噌 スープ park.ajinomoto.co.jp
1 2 https://cookpad.com/search/%E5%91%B3%E5%99%8C%E3%82%B9%E3%83%BC%E3%83%97 みんなの「味噌スープ」レシピが2,646品 - クックパッド 味噌 スープ cookpad.com
2 3 https://www.kurashiru.com/lists/2bcbf316-e3ae-4b13-839a-2365ad21a4c5?page=3 味噌スープのレシピ おすすめの30選を紹介(3ページ目) 味噌 スープ www.kurashiru.com
3 4 https://recipe.rakuten.co.jp/word/%E5%91%B3%E5%99%8C%E3%82%B9%E3%83%BC%E3%83%97/ 味噌スープレシピ・作り方の人気順|簡単料理の楽天レシピ 味噌 スープ recipe.rakuten.co.jp
4 5 https://www.e-umeya.com/recipe/recipedetail/consommemisosoup コンソメ味噌スープレシピ 梅屋の簡単レシピ - 山内本店 味噌 スープ www.e-umeya.com
5 6 https://oceans-nadia.com/user/22780/recipe/241192 お鍋で3分 『もやしのうま辛 スタミナ味噌スープ』 味噌 スープ oceans-nadia.com
6 7 https://www.bellfoods.co.jp/product/detail.php?item=142781489 ラーメンスープ華味みそ味120g - ベル食品 味噌 スープ www.bellfoods.co.jp
7 8 https://kakakunara.com/rakusyoku/miso-soup/ お味噌で作る絶品スープレシピ6選!スープと合うのはどんな ... 味噌 スープ kakakunara.com
8 9 https://life.ja-group.jp/recipe/detail?id=3572 青ネギとしめじの中華風味噌スープ - JAグループ 味噌 スープ life.ja-group.jp
9 10 https://www.08m.co.jp/products/%E5%91%B3%E5%99%8C%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%B3%E3%82%B9%E3%83%BC%E3%83%97/ 味噌ラーメンスープ - 株式会社マルハチ村松 味噌 スープ www.08m.co.jp
10 11 https://www.marukome.co.jp/list/%E7%89%9B%E4%B9%B3-%E5%91%B3%E5%99%8C-%E3%82%B9%E3%83%BC%E3%83%97/ 牛乳 味噌 スープ - 13 件の検索結果 - マルコメ 味噌 スープ www.marukome.co.jp
11 12 https://delishkitchen.tv/recipes/179768339470483878 みそ風味で温まる♪ ニラのごま味噌スープのレシピ動画・作り方 味噌 スープ delishkitchen.tv
12 13 https://oceans-nadia.com/user/484627/recipe/449227 【豚バラキャベツの旨味噌スープ】美味しい組み合わせで♪旨み 味噌 スープ oceans-nadia.com
13 14 https://www.maff.go.jp/j/seisan/kakou/mezamasi/recipe/recipe283.html 具だくさん味噌スープ - 農林水産省 味噌 スープ www.maff.go.jp
14 15 https://pokapokabiyori.net/archives/42464472.html 極旨味噌ラーメンみたいなキャベツスープ - ぽかぽかびより 味噌 スープ pokapokabiyori.net
15 16 https://www.hikarimiso.co.jp/products/list/cat-007/ スープ ひかり味噌株式会社 味噌 スープ www.hikarimiso.co.jp
16 17 https://www.sushijoto.jp/shops/0054/products/5103038 【すし上等!】I80 牛もつ 味噌スープ 1人前 味噌 スープ www.sushijoto.jp
17 18 http://www.motsujiro.shop/?pid=114892949 ガツンと男前、特性味噌スープ「殿さま鍋」(濃厚特性味噌味 ... 味噌 スープ www.motsujiro.shop
18 19 https://www.youtube.com/watch?v=3RZpXXjv5BA 【食欲の秋】味噌スープもつ鍋〜今年もお鍋の季節になりました 味噌 スープ www.youtube.com
19 20 https://www.amazon.co.jp/%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%A1-%E3%81%9F%E3%81%BE%E3%81%AD%E3%81%8E%E3%81%BF%E3%81%9D%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%A0%E3%82%B9%E3%83%BC%E3%83%97-20%E9%A3%9F/dp/B0886NP1PY Amazon.co.jp: マルコメ たまねぎみそクリームスープ 20食 味噌 スープ www.amazon.co.jp

【3】補足

◆コード補足

●find_element_by_nameが使えない

昔はfind_element_by_xxxでできたが現在そのコードのままだと

'WebDriver' object has no attribute 'find_element_by_name'というエラーが表示される。

driver.find_element_by_name('q').send_keys(query_string) #今まで 
driver.find_element(By.NAME,'q').send_keys(query_string) #今回
●chromedriverの更新が必要

通常だと更新が必要だが、ChromeDriverManagerのモジュールを使用することで更新不要になる。

driver = webdriver.Chrome() #更新必要
driver = webdriver.Chrome(ChromeDriverManager().install()) #更新不要