開発経緯
初めて記事を書きます。kumaです。
去年の11月からOKネットスーパーを利用しています。
徒歩やバイクで買い出ししていたので持って帰る容量を考えたり、買い出しの時間が減って嬉しく思っていました。
しかし、最近カートに入れる作業が毎回1時間かかるのが苦痛になってきたので勉強も兼ねて自動化することにした。
開発環境
- MacBookPro14インチ
- macOS 12.6
- Python 3.10.6
- openpyxl 3.0.10
- selenium 4.4.3
- EXCEL
概要
【自動】OKネットスーパーのWEBページを開いてログイン情報を記入する。
【手動】reCAPTHAは手動で操作する。
【自動】EXCELで買い物リストを作成して、そのリストに従いOKネットスーパーで検索して一番目に出てきたものをカートに入れる。
【手動】カートに入った買い物するものを確認し、配送日を選んで決済へ!!!
ソースコード
# coding:utf-8
# ok_net.py
from multiprocessing.resource_sharer import stop
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome import service as fs
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from time import sleep
import openpyxl
import os
import signal
# ログイン情報
#あなたのIDを入れてください。
myid = "yourID"
#あなたのPASSWORDを
mypass = "yourPASSWORD"
# エクセル設定
wb = openpyxl.load_workbook('./ok_list.xlsm')
ws = wb['Sheet1']
maxRow = ws.max_row
i = 0
# ブラウザを開く。
CHROMEDRIVER = "***************/chromedriver"
chrome_service = fs.Service(executable_path=CHROMEDRIVER)
driver = webdriver.Chrome(service=chrome_service)
# Googleの検索TOP画面を開く。
driver.get("https://ok-netsuper.com/login")
# ログイン操作
mail = driver.find_element(By.ID, "username")
password = driver.find_element(By.ID, "password")
mail.send_keys(myid)
password.send_keys(mypass)
# 認証と配送時間を人が操作する時間待機
# wait = WebDriverWait(driver, timeout=30)
# wait.until(EC.presence_of_element_located(By.NAME, "header-bottom-loginuser-schedule"))
sleep(20)
driver.get("https://ok-netsuper.com/delivery-timetable/delivery-timetable-select")
driver.find_element(By.XPATH,"/html/body/div[2]/div[1]/div[2]/div/form/table/tbody/tr[3]/td[2]").click()
driver.find_element(By.ID,"continue-shopping").click()
sleep(2)
# タブを開く
driver.execute_script("window.open();")
# 開いたタブをアクティブにする
driver.switch_to.window(driver.window_handles[1])
# okホーム開く
driver.get("https://ok-netsuper.com/")
try:
# ここからリストがなくなるまでloop
for i in range(2,maxRow + 1):
if ws.cell(row = i, column = 2).value is not None:
# リストから商品名を取得
product_name = ws.cell(row = i, column = 1).value
# リストから個数を取得
value = ws.cell(row = i, column = 2).value
# 商品を検索欄選択
search_product = driver.find_element(By.CSS_SELECTOR, "input.header-bottom-search-input")
# 検索欄をクリア
search_product.clear()
# 検索欄に商品名を記入
search_product.send_keys(product_name)
# ENTERを押す
search_product.send_keys(Keys.ENTER)
sleep(1)
try:
for j in range(value):
driver.find_elements(By.CSS_SELECTOR,".ok-button")[4].click()
sleep(1)
except IndexError:
# none_link = none_link + " " + product_name
print(product_name)
# ws.cell(row = i, column = 3).value = "検索なし"
# wb.save(wb)
finally:
os.kill(driver.service.process.pid,signal.SIGTERM)
現在の課題と今後の展望
検索結果に出てこなかったときターミナルに商品名を表示しているがEXCELに表示したい。
検索結果に2商品以上出てきても、最初に出てきたものをカートに入れてしまうので2個以上検索結果が出た時の処理を考える。
商品をカートに入れるところはもう少しスマートにできそう。
少し使ってみて、アップデートしようと思う。