指定したURLのプレビューボタンをクリックしPDFをダウンロードするpythonコードの作成
amazonS3からファイルの取得はできたけど
動的サイトからのリンク取得はこの方法ではできなかった
以下ログ
指定したURLにアクセスし
プレビューと書かれたボタンをクリック、表示されるPDFファイルをダウンロードするpythonコード
を
chatGPTで作成していく
1 | pip install requests beautifulsoup4 |
で必要ライブラリのインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import requests from bs4 import BeautifulSoup # ステップ2: 指定されたURLにGETリクエストを送信し、HTMLを取得 url = "https://任意のURL" response = requests.get(url) html = response.content # ステップ3: BeautifulSoupを使用してHTMLを解析し、プレビューボタンのリンクを見つける soup = BeautifulSoup(html, 'html.parser' ) preview_button = soup. find ( 'a' , text= 'プレビュー' ) # ここではaタグでテキストが'プレビュー'の要素を探していますが、実際の構造に応じて変更する必要があります。 # ステップ4: プレビューボタンのリンクを取得し、PDFファイルをダウンロード if preview_button: pdf_url = preview_button[ 'href' ] # href属性からPDFのURLを取得 pdf_response = requests.get(pdf_url) with open ( 'document.pdf' , 'wb' ) as f: f.write(pdf_response.content) print( "PDFファイルがダウンロードされました。" ) else : print( "プレビューボタンが見つかりませんでした。" ) |
で実行したが
1 2 3 | /Users/snowpool/aw10s/mail_auto/get_pdf .py:11: DeprecationWarning: The 'text' argument to find ()- type methods is deprecated. Use 'string' instead. preview_button = soup. find ( 'a' , text= 'プレビュー' ) # ここではaタグでテキストが'プレビュー'の要素を探していますが、実際の構造に応じて変更する必要があります。 プレビューボタンが見つかりませんでした。 |
となる
ChatGPTでこの結果を調べると
1 2 3 4 | 警告メッセージに基づき、text引数の代わりにstring引数を使用する必要があります。また、プレビューボタンが見つからなかった問題に関しては、ページのHTML構造を確認せずに正確な解決策を提供するのは難しいですが、一般的なアドバイスをいくつか提供できます。 * string引数の使用: find メソッドでtextの代わりにstringを使用してみてください。 * 正しい要素を特定する: プレビューボタンを特定するために、ページのHTMLソースを確認し、ボタンの正確なタグ名、クラス名、またはIDを特定します。この情報を元に、 find またはfind_allメソッドを適切に使用してください。 * 動的コンテンツの考慮: もしプレビューボタンがJavaScriptによって動的に生成されている場合、requestsとBeautifulSoupだけでは取得できないかもしれません。この場合は、seleniumのようなブラウザ自動化ツールを使用して実際のブラウザセッションを介してページを読み込み、要素を探す必要があります。 |
となる
以下は、string引数を使用した修正されたコードの例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import requests from bs4 import BeautifulSoup # ステップ2: 指定されたURLにGETリクエストを送信し、HTMLを取得 url = "https://任意のURL" response = requests.get(url) html = response.content # ステップ3: BeautifulSoupを使用してHTMLを解析し、プレビューボタンのリンクを見つける soup = BeautifulSoup(html, 'html.parser' ) preview_button = soup. find ( 'a' , string= 'プレビュー' ) # `text`の代わりに`string`を使用 # ステップ4: プレビューボタンのリンクを取得し、PDFファイルをダウンロード if preview_button: pdf_url = preview_button[ 'href' ] # href属性からPDFのURLを取得 pdf_response = requests.get(pdf_url) with open ( 'document.pdf' , 'wb' ) as f: f.write(pdf_response.content) print( "PDFファイルがダウンロードされました。" ) else : print( "プレビューボタンが見つかりませんでした。" ) |
でもだめ
seleniumで取得してみる
1 | pip install selenium |
で
seleniumをインストール
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options import time # Chromeのダウンロード設定 chrome_options = Options() prefs = { "download.default_directory" : "/path/to/download/directory" , # ダウンロードフォルダーのパスを設定 "download.prompt_for_download" : False, # ダウンロード前に確認を求めない "download.directory_upgrade" : True, "plugins.always_open_pdf_externally" : True # PDFファイルを自動的にダウンロード } chrome_options.add_experimental_option( "prefs" , prefs) # Chrome WebDriverのパス webdriver_path = '/path/to/chromedriver' # ChromeDriverのパス # WebDriverサービスを設定 service = Service(webdriver_path) # WebDriverの初期化 driver = webdriver.Chrome(service=service, options=chrome_options) # Webページにアクセス # プレビューボタンを探してクリック(要素のXPathを使用) # 実際のボタンのXPathに応じて調整してください try: preview_button = driver.find_element(By.XPATH, '//button[contains(text(),"プレビュー")]' ) preview_button.click() time . sleep (5) # ダウンロード完了を待つ except Exception as e: print( "エラーが発生しました:" , e) # ブラウザを閉じる driver.quit() |
でもだめ
ならば chrome developer tools で一度サイトの構成を調べる
1 | <a href= "https://s3.ap-northeast-1.amazonaws.com/storage.cocoo.education/ファイルの保存先" target= "_blank" >プレビュー< /a > |
となっていたが
これの構成で seleniumでダウンロードしようとしてもエラー
なので
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import requests # PDFファイルのURL pdf_url = "https://s3.ap-northeast-1.amazonaws.com/storage.cocoo.education/ファイルの保存先" # リクエストを送信してPDFファイルを取得 response = requests.get(pdf_url) # レスポンスのステータスコードが200(成功)の場合、ファイルを保存 if response.status_code == 200: with open ( "downloaded_file.pdf" , "wb" ) as file : file .write(response.content) print( "PDFファイルが正常にダウンロードされました。" ) else : print(f "ファイルのダウンロードに失敗しました。ステータスコード: {response.status_code}" ) |
として直接リンクのURLからファイルを取得
これは成功
なので、
GMAILからリンクURLを抜き出しサイトへアクセスする機能
次にそのページからリンクボタンのURLを抜き出す機能
最後にPDFをダウンロードする機能
と分けて作成する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import requests from bs4 import BeautifulSoup # 初期ページのURL initial_url = "https://任意のURL" # 初期ページからHTMLを取得 response = requests.get(initial_url) html = response.content # HTMLを解析 soup = BeautifulSoup(html, 'html.parser' ) # 'プレビュー'リンクを探す preview_link = soup. find ( 'a' , text= 'プレビュー' ) if preview_link: href_value = preview_link[ 'href' ] print( "プレビューのリンク:" , href_value) else : print( "プレビューリンクが見つかりませんでした。" ) |
しかし

1 2 3 | /Users/snowpool/aw10s/mail_auto/get_pdf_url .py:15: DeprecationWarning: The 'text' argument to find ()- type methods is deprecated. Use 'string' instead. preview_link = soup. find ( 'a' , text= 'プレビュー' ) プレビューリンクが見つかりませんでした。 |
となる
このため
BeautifulSoupの最新バージョンでは、findメソッド(および関連メソッド)でtext引数の代わりにstring引数を使用するよう推奨
とのことのため
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import requests from bs4 import BeautifulSoup # 初期ページのURL initial_url = "https://任意のURL" # 初期ページからHTMLを取得 response = requests.get(initial_url) html = response.content # HTMLを解析 soup = BeautifulSoup(html, 'html.parser' ) # 'プレビュー'リンクを探す('string'引数を使用) preview_link = soup. find ( 'a' , string= 'プレビュー' ) if preview_link: href_value = preview_link[ 'href' ] print( "プレビューのリンク:" , href_value) else : # 'プレビュー'を含むテキストを持つリンクを探す場合の代替手段 preview_links = soup.find_all( 'a' ) for link in preview_links: if 'プレビュー' in link.text: print( "プレビューのリンク:" , link[ 'href' ]) break else : print( "プレビューリンクが見つかりませんでした。" ) |
へ変更したが

プレビューリンクが見つかりませんでした。
となる
webページの構造が予想と異なるか、リンクが動的に生成されている可能性があり
のようなケースでは、ブラウザの自動操作が可能なSeleniumのようなツールを使用する必要がある
念の為Javascriptで書かれているかチェック
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import requests from bs4 import BeautifulSoup # 初期ページのURL initial_url = "https://任意のURL" # 初期ページからHTMLを取得 response = requests.get(initial_url) html = response.content # HTMLを解析 soup = BeautifulSoup(html, 'html.parser' ) # ページ内のすべてのaタグを探索 links = soup.find_all( 'a' ) found = False for link in links: if link.text and 'プレビュー' in link.text: print( "プレビューのリンク:" , link[ 'href' ]) found = True break if not found: print( "プレビューリンクが見つかりませんでした。" ) |
の結果
1 | プレビューリンクが見つかりませんでした |
となったため
Seleniumを使うことにする
seleniumを使うにはwebdriverが必要