質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

PyPDF2

PyPDF2は、PythonでPDF操作ができるモジュールの一つ。テキストや画像の抽出や、PDFの結合や分割処理などを簡単なコードで実現できます。ただし、日本語テキストを抽出することはできません。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

923閲覧

Python Seleniumにてページ遷移とPDF保存のループについて

fukushima_ekubo

総合スコア24

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

PyPDF2

PyPDF2は、PythonでPDF操作ができるモジュールの一つ。テキストや画像の抽出や、PDFの結合や分割処理などを簡単なコードで実現できます。ただし、日本語テキストを抽出することはできません。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2023/10/31 03:56

編集2023/10/31 05:17

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • 複数ページあるサイトの1ページ目を表示
  • 最後のページを表示し、ページ数を取得
  • 全ページの範囲でループ
  • ループ内で印刷>次のページへ
  • 取得したPDFを1枚のPDFへ結合し、指定のフォルダへ保存
  • 取得したPDFを削除

前提

Python Seleniumを使用して、上記工程を自動化しております。

ループ内でPDFを取得する過程において、指定フォルダに101枚のPDFが保存されると、
ページ遷移と印刷ダイアログは表示されるのですが、以降のPDFが保存されなくなります。

page
page(1)
page(2)
...
page(100)

というPDFまでが保存され、最後の結合でもページ数101枚のPDFが作成されます。
エラーは表示されず、処理終了となります。どこか不明な場所へ保存されているのではないかと思われます。

初心者でして、作法などあまり分かっておらず、お手柔らかにお願いできますと幸いです。

該当のソースコード

Python

1from selenium import webdriver 2from selenium.webdriver.common.by import By 3from selenium.webdriver.support import expected_conditions as EC 4from selenium.webdriver.chrome.options import Options 5import time 6import chromedriver_binary 7import pickle 8import json 9import os 10import random 11import pypdf 12import glob 13import shutil 14 15 16error_flg = False 17options = Options() 18options.add_argument('--kiosk-printing') 19 20download = '/Users/me/Documents/pdfs' #保存先 21 22target_url ='https://~~~?page=1' #アクセスするURL 23 24#プリンタを自動で閉じる 25appState = { 26 "recentDestinations": [ 27 { 28 "id": "Save as PDF", 29 "origin": "local", 30 "account": "" 31 } 32 ], 33 "selectedDestinationId": "Save as PDF", 34 "version": 2, 35 "pageSize": 'A4' 36} 37 38options.add_experimental_option("prefs", { 39 "printing.print_preview_sticky_settings.appState": 40 json.dumps(appState), 41 "savefile.default_directory" : download }) 42 43driver = webdriver.Chrome(options=options) 44 45# 取得済みクッキーの読み込み・書き込み 46if error_flg is False: 47 try: 48 driver.get(target_url) 49 driver.delete_all_cookies() 50 cookies = pickle.load(open("cookies.pkl", "rb")) 51 for cookie in cookies: 52 driver.add_cookie(cookie) 53 # URLにアクセス 54 driver.get(target_url) 55 56 time.sleep(1) 57 58 except Exception: 59 print('取得済みクッキーの読み込み・書き込み時にエラーが発生しました。') 60 error_flg = True 61 62if error_flg is False: 63 try: 64  #タイトルの取得 65 pdf_title = driver.find_element(by=By.CLASS_NAME,value='Info__title').text 66 #最後のページへ移動 67 move_tail = driver.find_element(by=By.ID,value="move-tail") 68 move_tail.click() 69 70 #最後のページの数値を取得 71 cur_url = driver.current_url 72 target = 'page=' 73 74 tail_idx = cur_url.find(target) 75 tail_number = int(cur_url[tail_idx+len(target):]) 76 77 num = tail_number - 1 #処理する回数 78 79 move_head = driver.find_element(by=By.ID,value="move-top") 80 move_head.click() 81 82 for _ in range(num): 83 button = driver.find_element(by=By.ID,value='print') 84 button.click() #印刷 85 86 time.sleep(1) 87 88 next = driver.find_element(by=By.ID,value="move-next") 89 next.click() #次のページへ 90 91 time.sleep(1) 92 93 driver.close() 94 95 except Exception: 96 print('PDF化中にエラーが発生しました。') 97 error_flg = True 98 99if error_flg is False: 100 try: 101   #PDFを結合 102 dir_path = "/Users/fukushimashun/Documents/pdfs/" 103 104 def merge_pdf_in_dir(dir_path, dst_path): 105 106 l = glob.glob(os.path.join(dir_path, '*.pdf')) 107 l.sort() 108 109 merger = pypdf.PdfMerger() 110 for p in l: 111 merger.append(p) 112 113 merger.write(dst_path) 114 merger.close() 115 116 merge_pdf_in_dir('/Users/me/Documents/pdfs', f'/Users/me/Documents/outputs/{pdf_title}.pdf') 117 118 #ファイル削除 119 target_dir = '/Users/me/Documents/pdfs' 120 121 shutil.rmtree(target_dir) 122 os.mkdir(target_dir) 123 124 except Exception: 125 print('PDF結合処理中にエラーが発生しました。') 126 error_flg = True

試したこと

chromeの更新とdriver再ダウンロード

補足情報(FW/ツールのバージョンなど)

chromeは118.0.5993.117
chrome driverは118.0.5993.70になっています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

<a href="zzz.zip">ZIP</a>というリンクを作って110回クリックしてみましたが、出来たファイル名は

text

1zzz.zip 2zzz (1).zip 3中略 4zzz (100).zip 5zzz - 2023-10-31T180806.245.zip 6zzz - 2023-10-31T180806.899.zip 7後略

でした。
Chromeの仕様かWindowsの仕様か分かりませんが、102個目以降はネーミングルールが変わるようなので、それに合わせてプログラムを書けば良いかと思います。

あと、質問とは関係ないですが、try exceptで例外をキャッチしている物の、メッセージを出すだけで他に何もせずに以降の処理をスキップしているようです。こういう例外処理は百害あって一利無しなので、try exceptは全部削除しましょう。「害」とは詳細なエラーメッセージを出さなくしているので、例外発生の原因追及が出来ません。

プログラムの性質(利用目的)によりますが、try exceptは、あらかじめ想定している例外発生時に、あらかじめ想定している処理を行うことで例外に対するリカバリー処理をする為に使います。想定していない例外はキャッチせずに標準のエラーメッセージを出すのが良いです。
(お客さん的なユーザーが使うプログラムだと、想定外の例外でも何らかのリカバリーが必要になるケースもありますが)

投稿2023/10/31 09:23

otn

総合スコア86295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fukushima_ekubo

2023/10/31 16:50

otn様 ご回答ありがとうございます。 >>Chromeの仕様かWindowsの仕様か分かりませんが、102個目以降はネーミングルールが変わるようなので、それに合わせてプログラムを書けば良いかと思います。 理解しました。ありがとうございます。 ただ、今回印刷ダイアログを自動で閉じているため、別名をつけて保存ができず、ネーミングの方向性が分かりかねております。。 もしこうすればできるよ、などコードでなくても構いませんので、ご教示いただけませんでしょうか。 何卒よろしくお願いいたします。
otn

2023/10/31 23:56 編集

> ただ、今回印刷ダイアログを自動で閉じているため、別名をつけて保存ができず、 別名を付けて保存?何故そんなことを? ファイル名に時刻が付いているので、sorted(glob.glob("zzz - 20??-??-??T??????.???.zip"))と、 globでで一覧を得て、sorted で時刻順(実際にやっているのはファイル名順ですが)に並べます。
fukushima_ekubo

2023/11/07 02:27

ありがとうございます。 以降も試してみましたが、102個目以降のファイルが保存されず、ファイル名うんぬんにたどり着けておりません。。 当方はmacを使用しておりますが、本現象について調べる方法はあるのでしょうか?
otn

2023/11/07 02:41

そもそも保存すらされていないのですね。zzz (100).zipまでが存在する状態で、手動で保存ダイアログを出すと、ファイル名欄はどうなっていますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問