Gmailで指定のメールの中から件名を指定し取得
が指定メール
これのうち
【Shufoo!】お気に入り店舗新着チラシお知らせメール
の件名のもののみ取得するようにする
この中の本文の中のURLへアクセスしチラシを取得する
が
https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc
の
杏林堂西田町
https://www.shufoo.net/pntweb/shopDetail/197728/?cid=nmail_pc
ユーコープ/袋井田町店
https://www.shufoo.net/pntweb/shopDetail/15782/?cid=nmail_pc
ぴあご袋井
とりあえず件名が
【Shufoo!】お気に入り店舗新着チラシお知らせメール
のものだけを取得する
vim get_mail_subject.py
中身は
import os.path
import base64
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
# 認証情報ファイルのパス
CREDENTIALS_FILE = 'path/to/credentials.json'
TOKEN_FILE = 'token.json'
# Gmail APIのスコープ
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
def main():
# トークンファイルが存在する場合は読み込む
creds = None
if os.path.exists(TOKEN_FILE):
creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES)
# 認証が有効でない場合は新しく認証を行う
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(CREDENTIALS_FILE, SCOPES)
creds = flow.run_local_server(port=0)
# トークンを保存する
with open(TOKEN_FILE, 'w') as token:
token.write(creds.to_json())
# Gmail APIクライアントを構築
service = build('gmail', 'v1', credentials=creds)
# メールを検索
query = 'subject:"【Shufoo!】お気に入り店舗新着チラシお知らせメール"'
results = service.users().messages().list(userId='me', q=query).execute()
messages = results.get('messages', [])
if not messages:
print('No messages found.')
else:
print(f'Found {len(messages)} messages:')
for msg in messages:
msg_id = msg['id']
msg = service.users().messages().get(userId='me', id=msg_id).execute()
msg_snippet = msg['snippet']
print(f'Message snippet: {msg_snippet}')
if __name__ == '__main__':
main()
そして認証ファイルをコピーする
cp ../mail_auto/credentials.json .
cp ../mail_auto/token.json .
実行すると
Found 24 messages:
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/shopDetail/860335/?cid=nmail_pc ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、1件の新着チラシが掲載開始されました。 ・ピアゴ袋井店https://www.shufoo.net/pntweb/shopDetail/15782/?cid=nmail_pc ※Shufoo!PCサイトまたは、シュフーチラシアプリ(スマートフォン・タブレット端末用) からログインしてお店の
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、4件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/shopDetail/860335/?cid=nmail_pc ・ユーコープ/袋井田町店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、4件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、1件の新着チラシが掲載開始されました。 ・ピアゴ袋井店https://www.shufoo.net/pntweb/shopDetail/15782/?cid=nmail_pc ※Shufoo!PCサイトまたは、シュフーチラシアプリ(スマートフォン・タブレット端末用) からログインしてお店の
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/shopDetail/860335/?cid=nmail_pc ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、4件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/shopDetail/860335/?cid=nmail_pc ・ユーコープ/袋井田町店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/shopDetail/860335/?cid=nmail_pc ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、1件の新着チラシが掲載開始されました。 ・ピアゴ袋井店https://www.shufoo.net/pntweb/shopDetail/15782/?cid=nmail_pc ※Shufoo!PCサイトまたは、シュフーチラシアプリ(スマートフォン・タブレット端末用) からログインしてお店の
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/shopDetail/860335/?cid=nmail_pc ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、1件の新着チラシが掲載開始されました。 ・ピアゴ袋井店https://www.shufoo.net/pntweb/shopDetail/15782/?cid=nmail_pc ※Shufoo!PCサイトまたは、シュフーチラシアプリ(スマートフォン・タブレット端末用) からログインしてお店の
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/shopDetail/860335/?cid=nmail_pc ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/shopDetail/860335/?cid=nmail_pc ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/shopDetail/860335/?cid=nmail_pc ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、4件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/shopDetail/860335/?cid=nmail_pc ・ユーコープ/袋井田町店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、3件の新着チラシが掲載開始されました。 ・杏林堂薬局/袋井旭町店https://www.shufoo.net/pntweb/shopDetail/860335/?cid=nmail_pc ・杏林堂薬局/袋井西田店https://www.shufoo.net/pntweb/
Message snippet: こちらのメールは「Shufoo!」でお気に入り登録した店舗の新着チラシ掲載開始をお知らせするメールです。 以下、1件の新着チラシが掲載開始されました。 ・ピアゴ袋井店https://www.shufoo.net/pntweb/shopDetail/15782/?cid=nmail_pc ※Shufoo!PCサイトまたは、シュフーチラシアプリ(スマートフォン・タブレット端末用) からログインしてお店の
というように
Ctrl + c で止めるまで続く
次に
取得したメールの本文の中に
https://www.shufoo.net/pntweb/shopDetail/15782/?cid=nmail_pc
もしくは
https://www.shufoo.net/pntweb/shopDetail/197728/?cid=nmail_pc
または
https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc
を含んでいる場合 safari の selenium でリンクページを開くようにコード変更
vim mail_url,py
で
import os.path
import base64
import re
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.safari.service import Service as SafariService
# 認証情報ファイルのパス
CREDENTIALS_FILE = 'path/to/credentials.json'
TOKEN_FILE = 'token.json'
# Gmail APIのスコープ
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
# 検索するURLリスト
URL_LIST = [
'https://www.shufoo.net/pntweb/shopDetail/15782/?cid=nmail_pc',
'https://www.shufoo.net/pntweb/shopDetail/197728/?cid=nmail_pc',
'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
]
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
def main():
# トークンファイルが存在する場合は読み込む
creds = None
if os.path.exists(TOKEN_FILE):
creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES)
# 認証が有効でない場合は新しく認証を行う
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(CREDENTIALS_FILE, SCOPES)
creds = flow.run_local_server(port=0)
# トークンを保存する
with open(TOKEN_FILE, 'w') as token:
token.write(creds.to_json())
# Gmail APIクライアントを構築
service = build('gmail', 'v1', credentials=creds)
# メールを検索
query = 'subject:"【Shufoo!】お気に入り店舗新着チラシお知らせメール"'
results = service.users().messages().list(userId='me', q=query).execute()
messages = results.get('messages', [])
if not messages:
print('No messages found.')
else:
print(f'Found {len(messages)} messages:')
for msg in messages:
msg_id = msg['id']
msg = service.users().messages().get(userId='me', id=msg_id).execute()
msg_payload = msg.get('payload', {})
msg_parts = msg_payload.get('parts', [])
msg_body = ''
for part in msg_parts:
if part['mimeType'] == 'text/plain':
msg_body = base64.urlsafe_b64decode(part['body']['data']).decode('utf-8')
break
# URLリスト内のURLを含むか確認
for url in URL_LIST:
if url in msg_body:
print(f'Opening URL: {url}')
open_link_in_safari(url)
break
if __name__ == '__main__':
main()
で実行
しかし取得できないので
メールの最新の1件を取得し その中に指定 のURLがあれば seleniumで開くようにする
が何も表示されないのでログを出力するようにコード変更
import os.path
import base64
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from selenium import webdriver
from selenium.webdriver.safari.service import Service as SafariService
# 認証情報ファイルのパス
CREDENTIALS_FILE = 'path/to/credentials.json'
TOKEN_FILE = 'token.json'
# Gmail APIのスコープ
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
# 検索するURLリスト
URL_LIST = [
'https://www.shufoo.net/pntweb/shopDetail/15782/?cid=nmail_pc',
'https://www.shufoo.net/pntweb/shopDetail/197728/?cid=nmail_pc',
'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
]
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
def get_email_body(parts):
"""メールパーツを再帰的に探索して本文を取得"""
for part in parts:
if part['mimeType'] == 'text/plain' or part['mimeType'] == 'text/html':
try:
body = base64.urlsafe_b64decode(part['body']['data']).decode('utf-8')
return body
except KeyError:
continue
except Exception as e:
print(f'Error decoding part: {e}')
continue
elif 'parts' in part:
body = get_email_body(part['parts'])
if body:
return body
return None
def main():
# トークンファイルが存在する場合は読み込む
creds = None
if os.path.exists(TOKEN_FILE):
creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES)
print("Loaded credentials from token file.")
# 認証が有効でない場合は新しく認証を行う
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
print("Credentials refreshed.")
else:
flow = InstalledAppFlow.from_client_secrets_file(CREDENTIALS_FILE, SCOPES)
creds = flow.run_local_server(port=0)
print("New credentials obtained.")
# トークンを保存する
with open(TOKEN_FILE, 'w') as token:
token.write(creds.to_json())
print("Credentials saved to token file.")
# Gmail APIクライアントを構築
service = build('gmail', 'v1', credentials=creds)
print("Gmail API client built.")
# メールを検索
query = 'subject:"【Shufoo!】お気に入り店舗新着チラシお知らせメール"'
results = service.users().messages().list(userId='me', q=query, maxResults=1).execute()
messages = results.get('messages', [])
if not messages:
print('No messages found.')
else:
print(f'Found {len(messages)} message(s).')
msg_id = messages[0]['id']
msg = service.users().messages().get(userId='me', id=msg_id).execute()
print(f'Fetched message with ID: {msg_id}')
msg_payload = msg.get('payload', {})
msg_body = get_email_body(msg_payload.get('parts', []))
if not msg_body:
print(f'No body found for message ID: {msg_id}')
return
print(f'Message ID: {msg_id}')
print(f'Message Body: {msg_body[:200]}...') # メール本文の一部を表示
# URLリスト内のURLを含むか確認
for url in URL_LIST:
if url in msg_body:
print(f'Opening URL: {url}')
open_link_in_safari(url)
break
if __name__ == '__main__':
main()
結果
Gmail API client built.
Found 1 message(s).
Fetched message with ID:
No body found for message ID:
となった
とりあえずラベルを shopにして
Shufooメールを自動振り分けする
とりあえずこのメールで最新のものを取得するようにするが
その前にブラウザで開くようにした
メールの本文が取得できない問題を解決するために、メールのペイロード構造をより詳細に確認し、可能なすべてのパートを再帰的にチェックして本文を取得する方法を強化します。また、HTML形式の本文も考慮しコード変更
import os.path
import base64
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from selenium import webdriver
from selenium.webdriver.safari.service import Service as SafariService
# 認証情報ファイルのパス
CREDENTIALS_FILE = 'path/to/credentials.json'
TOKEN_FILE = 'token.json'
# Gmail APIのスコープ
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
# 検索するURLリスト
URL_LIST = [
'https://www.shufoo.net/pntweb/shopDetail/15782/?cid=nmail_pc',
'https://www.shufoo.net/pntweb/shopDetail/197728/?cid=nmail_pc',
'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
]
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
def get_email_body(parts):
"""メールパーツを再帰的に探索して本文を取得"""
for part in parts:
if part['mimeType'] == 'text/plain' or part['mimeType'] == 'text/html':
try:
body_data = part['body'].get('data')
if body_data:
body = base64.urlsafe_b64decode(body_data).decode('utf-8')
return body
except Exception as e:
print(f'Error decoding part: {e}')
elif 'parts' in part:
body = get_email_body(part['parts'])
if body:
return body
return None
def main():
# トークンファイルが存在する場合は読み込む
creds = None
if os.path.exists(TOKEN_FILE):
creds = Credentials.from_authorized_user_file(TOKEN_FILE, SCOPES)
print("Loaded credentials from token file.")
# 認証が有効でない場合は新しく認証を行う
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
print("Credentials refreshed.")
else:
flow = InstalledAppFlow.from_client_secrets_file(CREDENTIALS_FILE, SCOPES)
creds = flow.run_local_server(port=0)
print("New credentials obtained.")
# トークンを保存する
with open(TOKEN_FILE, 'w') as token:
token.write(creds.to_json())
print("Credentials saved to token file.")
# Gmail APIクライアントを構築
service = build('gmail', 'v1', credentials=creds)
print("Gmail API client built.")
# メールを検索
query = 'subject:"【Shufoo!】お気に入り店舗新着チラシお知らせメール"'
results = service.users().messages().list(userId='me', q=query, maxResults=1).execute()
messages = results.get('messages', [])
if not messages:
print('No messages found.')
else:
print(f'Found {len(messages)} message(s).')
msg_id = messages[0]['id']
msg = service.users().messages().get(userId='me', id=msg_id, format='full').execute()
print(f'Fetched message with ID: {msg_id}')
msg_payload = msg.get('payload', {})
msg_body = get_email_body([msg_payload])
if not msg_body:
print(f'No body found for message ID: {msg_id}')
return
print(f'Message ID: {msg_id}')
print(f'Message Body: {msg_body[:200]}...') # メール本文の一部を表示
# URLリスト内のURLを含むか確認
for url in URL_LIST:
if url in msg_body:
print(f'Opening URL: {url}')
open_link_in_safari(url)
break
if __name__ == '__main__':
main()
これでURLを開くことができた
改良点
1. メールペイロードの完全な再帰的探索: メールペイロード全体を再帰的に探索し、本文データを見つけ出す。
2. デコードエラーハンドリング: デコードエラーが発生した場合にエラーメッセージを出力して継続する。
3. デバッグ情報の追加: 追加のデバッグ出力により、メールの取得プロセスの各ステップが明確になる。
次に
7/30 日替
というような日付のリンクをクリックするようにする
import datetime
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.safari.service import Service as SafariService
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
time.sleep(3) # リンクを開いた後に3秒間待機
return driver
def click_date_element(driver):
# 今日の日付を取得
today_str = datetime.datetime.now().strftime("%m/%d")
# 日付フォーマットの調整
today_str = today_str.lstrip("0").replace("/", "月") + "日替"
try:
# 日付要素を探してクリック
element = driver.find_element(By.XPATH, f"//*[contains(text(), '{today_str}')]")
element.click()
print(f'Clicked on element with text: {today_str}')
time.sleep(3) # クリックした後に3秒間待機
except Exception as e:
print(f'Error clicking on element: {e}')
def main():
url = 'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
driver = open_link_in_safari(url)
click_date_element(driver)
driver.quit()
if __name__ == '__main__':
main()
としたが
Error clicking on element: Message: ; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
となってしまう
このエラーは、指定された要素がページ上に見つからなかったことを示しています。この問題を解決するためには、ページが完全に読み込まれるまで待機する必要があります。また、指定されたXPathが正しいことを確認する必要があります
とのこと
追加の変更点
1. WebDriverWaitを使用して要素が見つかるまで待機:
pythonコードをコピーする
WebDriverWait(driver, 10).until(
2. EC.presence_of_element_located((By.XPATH, f”//*[contains(text(), ‘{today_str}’)]”))
3. )
4.
5. デバッグ用に要素のリストを表示: 要素が見つからない場合に、ページ上の要素をリストして表示します。
pythonコードをコピーする
elements = driver.find_elements(By.XPATH, “//*”)
6. for elem in elements:
7. print(elem.text)
ということで
import datetime
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.safari.service import Service as SafariService
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
time.sleep(3) # リンクを開いた後に3秒間待機
return driver
def click_date_element(driver):
# 今日の日付を取得
today_str = datetime.datetime.now().strftime("%m/%d")
# 日付フォーマットの調整
today_str = today_str.lstrip("0").replace("/", "月") + "日替"
try:
# 日付要素を探してクリック
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, f"//*[contains(text(), '{today_str}')]"))
)
element = driver.find_element(By.XPATH, f"//*[contains(text(), '{today_str}')]")
element.click()
print(f'Clicked on element with text: {today_str}')
time.sleep(3) # クリックした後に3秒間待機
except Exception as e:
print(f'Error clicking on element: {e}')
# デバッグ用にページ上の要素をリストする
elements = driver.find_elements(By.XPATH, "//*")
for elem in elements:
print(elem.text)
def main():
url = 'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
driver = open_link_in_safari(url)
click_date_element(driver)
driver.quit()
if __name__ == '__main__':
main()
これで取得した結果を
python click_url.py > shop.txt
でみたけど量が多すぎるので
Chatgptでエラーになる
一度 developer tools でサイトの構成を見る
xpathだと
/html/body/div[1]/div[3]/div[1]/div/div[4]/div/div/div/div/div/div/ul
の中にリンクがある
/html/body/div[1]/div[3]/div[1]/div/div[4]/div/div/div/div/div/div/ul/li[2]/a
がそのリンク
しかし表示されない
import datetime
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.safari.service import Service as SafariService
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
time.sleep(3) # リンクを開いた後に3秒間待機
return driver
def click_date_element(driver, xpath):
try:
# 日付要素を探してクリック
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, xpath))
)
container = driver.find_element(By.XPATH, xpath)
# コンテナ内のすべてのリンクを取得
links = container.find_elements(By.TAG_NAME, 'a')
today_str = datetime.datetime.now().strftime("%m/%d").lstrip("0").replace("/", "月") + "日替"
for link in links:
if today_str in link.text:
link.click()
print(f'Clicked on link with text: {link.text}')
time.sleep(3) # クリックした後に3秒間待機
return
print(f'No link found with text: {today_str}')
except Exception as e:
print(f'Error clicking on element: {e}')
def main():
url = 'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
driver = open_link_in_safari(url)
# ここで指定されたXPathを使用
xpath = '/html/body/div[1]/div[3]/div[1]/div/div[4]/div/div/div/div/div/div/ul'
click_date_element(driver, xpath)
driver.quit()
if __name__ == '__main__':
main()
直接りんくのHTMLを調べる
<a href="//www.shufoo.net/pntweb/shopDetail/860323/86383836863914/" class="sc_custom_link" rel="sd_shop_chirashi_list" title="7/30 日替">
<span class="shop_chirashi_list_thumb"><img src="//ipqcache2.shufoo.net/c/2024/07/26/c/3927665654283/index/img/thumb/thumb_m.jpg" alt=""></span>
<span class="shop_chirashi_list_title">7/30 日替</span>
</a>
日付を指定せず
日替
と書かれたリンクをクリックするようにした
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.safari.service import Service as SafariService
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
time.sleep(3) # リンクを開いた後に3秒間待機
return driver
def click_date_element(driver, base_xpath):
try:
# コンテナ内の日付要素を探してクリック
container = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, base_xpath))
)
links = container.find_elements(By.XPATH, ".//a[contains(@title, '日替')]")
for link in links:
if '日替' in link.get_attribute('title'):
link.click()
print(f'Clicked on link with title: {link.get_attribute("title")}')
time.sleep(3) # クリックした後に3秒間待機
return
print('No link found with title containing: 日替')
except Exception as e:
print(f'Error clicking on element: {e}')
def main():
url = 'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
driver = open_link_in_safari(url)
# ここで指定されたXPathを使用
base_xpath = '/html/body/div[1]/div[3]/div[1]/div/div[4]/div/div/div/div/div/div/ul'
click_date_element(driver, base_xpath)
driver.quit()
if __name__ == '__main__':
main()
これでクリックはできたので
次に画像を取得
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/button_cover_turn_over.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/button_cover_turn_over.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/button_cover_basic.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/button_cover_basic.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/button_cover_basic.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/button_cover_basic.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/button_cover_basic.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/button_cover_basic.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://ipqcache2.shufoo.net/c/2024/07/24/29355636822862/index/img/0_100_0.jpg
Found image: https://ipqcache2.shufoo.net/c/2024/07/24/29355636822862/index/img/0_100_1.jpg
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
Found image: https://www.shufoo.net/site/chirashi_viewer_js/images/transparent.png
となるので
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.safari.service import Service as SafariService
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
time.sleep(3) # リンクを開いた後に3秒間待機
return driver
def get_images_from_container(driver, base_xpath):
try:
# コンテナ内の画像要素を探す
container = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, base_xpath))
)
images = container.find_elements(By.TAG_NAME, 'img')
for img in images:
src = img.get_attribute('src')
# 特定の条件に基づいて画像をフィルタリング
if 'index/img' in src:
print(f'Found image: {src}')
except Exception as e:
print(f'Error finding images: {e}')
def main():
url = 'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
driver = open_link_in_safari(url)
# ここで指定されたXPathを使用
base_xpath = '/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]'
get_images_from_container(driver, base_xpath)
driver.quit()
if __name__ == '__main__':
main()
とする
取得された画像の中には多くの透明画像やボタン画像が含まれているようです。特定の条件に基づいて必要な画像をフィルタリングする必要があります。以下のように、特定の条件を追加して必要な画像のみを取得するようにコードを修正
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.safari.service import Service as SafariService
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
time.sleep(3) # リンクを開いた後に3秒間待機
return driver
def get_images_from_container(driver, base_xpath):
try:
# コンテナ内の画像要素を探す
container = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, base_xpath))
)
images = container.find_elements(By.TAG_NAME, 'img')
for img in images:
src = img.get_attribute('src')
# 特定の条件に基づいて画像をフィルタリング
if 'index/img' in src:
print(f'Found image: {src}')
except Exception as e:
print(f'Error finding images: {e}')
def main():
url = 'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
driver = open_link_in_safari(url)
# ここで指定されたXPathを使用
base_xpath = '/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]'
get_images_from_container(driver, base_xpath)
driver.quit()
if __name__ == '__main__':
main()
コードの説明
1. リンクを開く:
pythonコードをコピーする
url = ‘https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc’
2. driver = open_link_in_safari(url)
3.
4. XPathに基づいてコンテナを探し、画像要素を取得する:
pythonコードをコピーする
base_xpath = ‘/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]’
5. get_images_from_container(driver, base_xpath)
6.
7. 画像URLを取得してフィルタリング:
pythonコードをコピーする
for img in images:
8. src = img.get_attribute(‘src’)
9. # 特定の条件に基づいて画像をフィルタリング
10. if ‘index/img’ in src:
11. print(f’Found image: {src}’)
12.
このスクリプトは、指定されたXPath内の画像要素を取得し、その画像URLに特定の文字列(index/img)が含まれている場合にのみ出力します。これにより、不要な画像を除外し、必要な画像のみを取得することができます。
結果として
Found image: https://ipqcache2.shufoo.net/c/2024/07/24/29355636822862/index/img/0_100_0.jpg Found image: https://ipqcache2.shufoo.net/c/2024/07/24/29355636822862/index/img/0_100_1.jpg
となった
パスの取得はできたので
指定されたURLを開き、指定されたXPathに基づいて画像を取得し、それらの画像をリストとして返します。さらに、必要に応じて画像をダウンロードする
import time
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.safari.service import Service as SafariService
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
time.sleep(3) # リンクを開いた後に3秒間待機
return driver
def get_images_from_container(driver, base_xpath):
image_urls = []
try:
# コンテナ内の画像要素を探す
container = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, base_xpath))
)
images = container.find_elements(By.TAG_NAME, 'img')
for img in images:
src = img.get_attribute('src')
# 特定の条件に基づいて画像をフィルタリング
if 'index/img' in src:
image_urls.append(src)
print(f'Found image: {src}')
except Exception as e:
print(f'Error finding images: {e}')
return image_urls
def download_images(image_urls):
for i, url in enumerate(image_urls):
response = requests.get(url)
if response.status_code == 200:
with open(f'image_{i}.jpg', 'wb') as file:
file.write(response.content)
print(f'Downloaded image_{i}.jpg')
else:
print(f'Failed to download {url}')
def main():
url = 'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
driver = open_link_in_safari(url)
# ここで指定されたXPathを使用
base_xpath = '/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]'
image_urls = get_images_from_container(driver, base_xpath)
driver.quit()
# 画像をダウンロード
if image_urls:
download_images(image_urls)
if __name__ == '__main__':
main()
コードの説明
1. リンクを開く:
pythonコードをコピーする
url = ‘https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc’
2. driver = open_link_in_safari(url)
3.
4. XPathに基づいてコンテナを探し、画像要素を取得する:
pythonコードをコピーする
base_xpath = ‘/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]’
5. image_urls = get_images_from_container(driver, base_xpath)
6.
7. 画像URLを取得してリストに追加:
pythonコードをコピーする
for img in images:
8. src = img.get_attribute(‘src’)
9. # 特定の条件に基づいて画像をフィルタリング
10. if ‘index/img’ in src:
11. image_urls.append(src)
12. print(f’Found image: {src}’)
13. 画像をダウンロード:
pythonコードをコピーする
def download_images(image_urls):
14. for i, url in enumerate(image_urls):
15. response = requests.get(url)
16. if response.status_code == 200:
17. with open(f’image_{i}.jpg’, ‘wb’) as file:
18. file.write(response.content)
19. print(f’Downloaded image_{i}.jpg’)
20. else:
21. print(f’Failed to download {url}’)
このスクリプトは、指定されたXPath内の画像要素を取得し、それらの画像URLをリストとして返します。その後、リスト内の画像URLを使用して画像をダウンロードします。ダウンロードされた画像はimage_0.jpg, image_1.jpgのように保存されます。
画像は保存できたので
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.safari.service import Service as SafariService
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
time.sleep(3) # リンクを開いた後に3秒間待機
return driver
def click_date_element(driver, base_xpath):
try:
# コンテナ内の日付要素を探してクリック
container = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, base_xpath))
)
links = container.find_elements(By.XPATH, ".//a[contains(@title, '日替')]")
for link in links:
if '日替' in link.get_attribute('title'):
link.click()
print(f'Clicked on link with title: {link.get_attribute("title")}')
time.sleep(3) # クリックした後に3秒間待機
return
print('No link found with title containing: 日替')
except Exception as e:
print(f'Error clicking on element: {e}')
def main():
url = 'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
driver = open_link_in_safari(url)
# ここで指定されたXPathを使用
base_xpath = '/html/body/div[1]/div[3]/div[1]/div/div[4]/div/div/div/div/div/div/ul'
click_date_element(driver, base_xpath)
driver.quit()
if __name__ == '__main__':
main()
の中にこの処理を追加して画像をダウンロードできるようにする
import time
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.safari.service import Service as SafariService
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
time.sleep(3) # リンクを開いた後に3秒間待機
return driver
def click_date_element(driver, base_xpath):
try:
# コンテナ内の日付要素を探してクリック
container = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, base_xpath))
)
links = container.find_elements(By.XPATH, ".//a[contains(@title, '日替')]")
for link in links:
if '日替' in link.get_attribute('title'):
link.click()
print(f'Clicked on link with title: {link.get_attribute("title")}')
time.sleep(3) # クリックした後に3秒間待機
return
print('No link found with title containing: 日替')
except Exception as e:
print(f'Error clicking on element: {e}')
def get_images_from_container(driver, base_xpath):
image_urls = []
try:
# コンテナ内の画像要素を探す
container = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, base_xpath))
)
images = container.find_elements(By.TAG_NAME, 'img')
for img in images:
src = img.get_attribute('src')
# 特定の条件に基づいて画像をフィルタリング
if 'index/img' in src:
image_urls.append(src)
print(f'Found image: {src}')
except Exception as e:
print(f'Error finding images: {e}')
return image_urls
def download_images(image_urls):
for i, url in enumerate(image_urls):
response = requests.get(url)
if response.status_code == 200:
with open(f'image_{i}.jpg', 'wb') as file:
file.write(response.content)
print(f'Downloaded image_{i}.jpg')
else:
print(f'Failed to download {url}')
def main():
url = 'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
driver = open_link_in_safari(url)
# 特定のリンクをクリックする
base_xpath_click = '/html/body/div[1]/div[3]/div[1]/div/div[4]/div/div/div/div/div/div/ul'
click_date_element(driver, base_xpath_click)
# 画像を取得してダウンロードする
base_xpath_images = '/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]'
image_urls = get_images_from_container(driver, base_xpath_images)
driver.quit()
if image_urls:
download_images(image_urls)
if __name__ == '__main__':
main()
コードの説明
1. リンクを開く:
pythonコードをコピーする
driver = open_link_in_safari(url)
2.
3. 特定のリンクをクリックする:
pythonコードをコピーする
base_xpath_click = ‘/html/body/div[1]/div[3]/div[1]/div/div[4]/div/div/div/div/div/div/ul’
4. click_date_element(driver, base_xpath_click)
5.
6. 画像を取得してダウンロードする:
pythonコードをコピーする
base_xpath_images = ‘/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]’
7. image_urls = get_images_from_container(driver, base_xpath_images)
8. driver.quit()
9.
10. if image_urls:
11. download_images(image_urls)
12.
このスクリプトは、指定されたURLを開き、「日替」という文字列が含まれるリンクをクリックし、その後、画像を取得してダウンロードします。これにより、リンククリックと画像ダウンロードの処理を一貫して行うことができます。
しかし画像が3分割されて見えにくいので統合する
pip install selenium pillow requests
で必要なライブラリをインストール
import time
import requests
from PIL import Image
from io import BytesIO
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.safari.service import Service as SafariService
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
time.sleep(3) # リンクを開いた後に3秒間待機
return driver
def click_date_element(driver, base_xpath):
try:
# コンテナ内の日付要素を探してクリック
container = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, base_xpath))
)
links = container.find_elements(By.XPATH, ".//a[contains(@title, '日替')]")
for link in links:
if '日替' in link.get_attribute('title'):
link.click()
print(f'Clicked on link with title: {link.get_attribute("title")}')
time.sleep(3) # クリックした後に3秒間待機
return
print('No link found with title containing: 日替')
except Exception as e:
print(f'Error clicking on element: {e}')
def get_images_from_container(driver, base_xpath):
image_urls = []
try:
# コンテナ内の画像要素を探す
container = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, base_xpath))
)
images = container.find_elements(By.TAG_NAME, 'img')
for img in images:
src = img.get_attribute('src')
# 特定の条件に基づいて画像をフィルタリング
if 'index/img' in src:
image_urls.append(src)
print(f'Found image: {src}')
except Exception as e:
print(f'Error finding images: {e}')
return image_urls
def download_images(image_urls):
images = []
for i, url in enumerate(image_urls):
response = requests.get(url)
if response.status_code == 200:
image = Image.open(BytesIO(response.content))
images.append(image)
print(f'Downloaded image_{i}.jpg')
else:
print(f'Failed to download {url}')
return images
def merge_images(images, output_path):
widths, heights = zip(*(img.size for img in images))
total_height = sum(heights)
max_width = max(widths)
combined_image = Image.new('RGB', (max_width, total_height))
y_offset = 0
for img in images:
combined_image.paste(img, (0, y_offset))
y_offset += img.height
combined_image.save(output_path)
print(f'Saved combined image as {output_path}')
def main():
url = 'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
driver = open_link_in_safari(url)
# 特定のリンクをクリックする
base_xpath_click = '/html/body/div[1]/div[3]/div[1]/div/div[4]/div/div/div/div/div/div/ul'
click_date_element(driver, base_xpath_click)
# 画像を取得してダウンロードする
base_xpath_images = '/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]'
image_urls = get_images_from_container(driver, base_xpath_images)
driver.quit()
if image_urls:
images = download_images(image_urls)
if images:
merge_images(images, 'combined_image.jpg')
if __name__ == '__main__':
main()
1. リンクを開く:
pythonコードをコピーする
driver = open_link_in_safari(url)
2.
3. 特定のリンクをクリックする:
pythonコードをコピーする
base_xpath_click = ‘/html/body/div[1]/div[3]/div[1]/div/div[4]/div/div/div/div/div/div/ul’
4. click_date_element(driver, base_xpath_click)
5.
6. 画像を取得してダウンロードする:
pythonコードをコピーする
base_xpath_images = ‘/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]’
7. image_urls = get_images_from_container(driver, base_xpath_images)
8.
9. 画像をダウンロード:
pythonコードをコピーする
images = download_images(image_urls)
10.
11. 画像を結合して保存:
pythonコードをコピーする
if images:
12. merge_images(images, ‘combined_image.jpg’)
13.
このスクリプトは、指定されたURLを開き、「日替」という文字列が含まれるリンクをクリックし、その後、画像を取得してダウンロードし、それらを1つの画像ファイルに統合します。統合された画像はcombined_image.jpgとして保存
しかし画像がバラバラ
import time
import requests
from PIL import Image
from io import BytesIO
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.safari.service import Service as SafariService
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def open_link_in_safari(url):
# Safariドライバーを使用してブラウザを起動
service = SafariService()
driver = webdriver.Safari(service=service)
driver.get(url)
time.sleep(3) # リンクを開いた後に3秒間待機
return driver
def click_date_element(driver, base_xpath):
try:
# コンテナ内の日付要素を探してクリック
container = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, base_xpath))
)
links = container.find_elements(By.XPATH, ".//a[contains(@title, '日替')]")
for link in links:
if '日替' in link.get_attribute('title'):
link.click()
print(f'Clicked on link with title: {link.get_attribute("title")}')
time.sleep(3) # クリックした後に3秒間待機
return
print('No link found with title containing: 日替')
except Exception as e:
print(f'Error clicking on element: {e}')
def get_images_from_container(driver, base_xpath):
image_urls = []
try:
# コンテナ内の画像要素を探す
container = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, base_xpath))
)
images = container.find_elements(By.TAG_NAME, 'img')
for img in images:
src = img.get_attribute('src')
# 特定の条件に基づいて画像をフィルタリング
if 'index/img' in src:
image_urls.append(src)
print(f'Found image: {src}')
except Exception as e:
print(f'Error finding images: {e}')
return image_urls
def download_images(image_urls):
images = []
for i, url in enumerate(image_urls):
response = requests.get(url)
if response.status_code == 200:
image = Image.open(BytesIO(response.content))
images.append(image)
print(f'Downloaded image_{i}.jpg')
else:
print(f'Failed to download {url}')
return images
def merge_images(images, output_path):
widths, heights = zip(*(img.size for img in images))
total_height = sum(heights)
max_width = max(widths)
combined_image = Image.new('RGB', (max_width, total_height))
y_offset = 0
for img in images:
combined_image.paste(img, (0, y_offset))
y_offset += img.height
combined_image.save(output_path)
print(f'Saved combined image as {output_path}')
def main():
url = 'https://www.shufoo.net/pntweb/shopDetail/860323/?cid=nmail_pc'
driver = open_link_in_safari(url)
# 特定のリンクをクリックする
base_xpath_click = '/html/body/div[1]/div[3]/div[1]/div/div[4]/div/div/div/div/div/div/ul'
click_date_element(driver, base_xpath_click)
# 画像を取得してダウンロードする
base_xpath_images = '/html/body/div[1]/div[3]/div[1]/div/div[2]/div[2]'
image_urls = get_images_from_container(driver, base_xpath_images)
driver.quit()
if image_urls:
images = download_images(image_urls)
if images:
merge_images(images, '/mnt/data/combined_image_corrected.jpg')
if __name__ == '__main__':
main()
で位置が合うか実験
結局位置は合わなかったが画像は一枚になった
直接杏林堂のHPで画像を取得しようとしたが
習慣のチラシになるためこの方法はやめた
とりあえずチラシの取得はできたので
次に
Cloud vision APIで文字列として商品情報が取得できるか試す