作ってみたものの、セキュリティ面で問題になりそうなので中断。
過程のメモです。
◆概要
GoogleCOLAB上でPython/seleniumを使い、業務システムの情報をスクレイピングしスプレッドシートに出力するシステムの構築。
◆中断の理由
Pythonを用いてスプレッドシートにデータを出力する際、承認処理が必要となり、Googleアカウントへのアクセスを求められる。
個人アカウントだったら良いものの、社用アカウントはリスクになりそう。
・出力された警告
>Google 認証情報へのアクセスをこのノートブックに許可しますか?
◆作成したソースコード
#諸々のインストール
!pip install selenium
!apt-get update
!apt-get install -y chromium-chromedriver
!cp /usr/lib/chromium-browser/chromedriver /usr/bin
!pip install selenium gspread oauth2client
!pip install selenium gspread oauth2client webdriver-manager
#seleniumやスプレッドシートを扱うためのAPIをインポート
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import pandas as pd
from google.colab import files
# Google Sheets APIの認証設定
def authenticate_gspread():
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_name('/content/credentials.json', scope)
client = gspread.authorize(creds)
return client
# Seleniumのセットアップ
def setup_selenium():
chrome_options = Options()
chrome_options.add_argument("--headless") # ヘッドレスモードでブラウザを起動
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)
return driver
# URLから要素を取得する関数
def get_element_from_url(url):
driver = setup_selenium()
driver.get(url)
# ここで要素を取得します。例として最初の<a>タグを取得します。
element = driver.find_element(By.TAG_NAME, 'a')
element_text = element.text
driver.quit()
return element_text
# スプレッドシートにデータを書き込む関数
def write_to_spreadsheet(value):
client = authenticate_gspread()
sheet = client.open_by_key('スプレッドシートURL').worksheet('シート名')
cell = sheet.find('特定のセル').row + 1
sheet.update_cell(cell, 1, value) # 1列目にデータを書き込む
# メイン関数
def main():
url = 'https://book.impress.co.jp/books/1123101044'
element_text = get_element_from_url(url)
write_to_spreadsheet(element_text)
if __name__ == "__main__":
# Google Sheets API認証情報をアップロード
uploaded = files.upload()
# 認証情報ファイルをColabに保存
for filename in uploaded.keys():
if filename.endswith('.json'):
credentials_path = f'/content/{filename}'
break
# メイン処理を実行
main()
◆今後の展望
スプレッドシートに認証の要らない(たぶん)GASで再チャレンジ