指定したURLのプレビューボタンをクリックしPDFをダウンロードするpythonコードの作成
amazonS3からファイルの取得はできたけど
動的サイトからのリンク取得はこの方法ではできなかった
以下ログ
指定したURLにアクセスし
プレビューと書かれたボタンをクリック、表示されるPDFファイルをダウンロードするpythonコード
を
chatGPTで作成していく
pip install requests beautifulsoup4
で必要ライブラリのインストール
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("プレビューボタンが見つかりませんでした。")
で実行したが
/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でこの結果を調べると
警告メッセージに基づき、text引数の代わりにstring引数を使用する必要があります。また、プレビューボタンが見つからなかった問題に関しては、ページのHTML構造を確認せずに正確な解決策を提供するのは難しいですが、一般的なアドバイスをいくつか提供できます。 * string引数の使用: findメソッドでtextの代わりにstringを使用してみてください。 * 正しい要素を特定する: プレビューボタンを特定するために、ページのHTMLソースを確認し、ボタンの正確なタグ名、クラス名、またはIDを特定します。この情報を元に、findまたはfind_allメソッドを適切に使用してください。 * 動的コンテンツの考慮: もしプレビューボタンがJavaScriptによって動的に生成されている場合、requestsとBeautifulSoupだけでは取得できないかもしれません。この場合は、seleniumのようなブラウザ自動化ツールを使用して実際のブラウザセッションを介してページを読み込み、要素を探す必要があります。
となる
以下は、string引数を使用した修正されたコードの例
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で取得してみる
pip install selenium
で
seleniumをインストール
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ページにアクセス
driver.get("https://任意のURL")
# プレビューボタンを探してクリック(要素の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 で一度サイトの構成を調べる
<a href="https://s3.ap-northeast-1.amazonaws.com/storage.cocoo.education/ファイルの保存先" target="_blank">プレビュー</a>
となっていたが
これの構成で seleniumでダウンロードしようとしてもエラー
なので
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をダウンロードする機能
と分けて作成する
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("プレビューリンクが見つかりませんでした。")
しかし

/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引数を使用するよう推奨
とのことのため
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で書かれているかチェック
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("プレビューリンクが見つかりませんでした。")
の結果
プレビューリンクが見つかりませんでした
となったため
Seleniumを使うことにする
seleniumを使うにはwebdriverが必要