python seleniumで名前を付けてファイル保存
解決したいこと
Python seleniumでcsvまたはpdfに名前を付けて保存(ダウンロード)したい
発生している問題・エラー
response = requests.get(file_url, headers=header) のところでresponseを確認すると Response [404]となってしまっていてファイルを取得できません。
file_urlは取得できているので、frameの切り替えまではできているようです。
また、link.click()をすればcsvは直接ダウンロードされますが、該当のサイトはpdfが開いてしまうので直接保存したいです。
該当するソースコード
ユーザーエージェントはなし・フルと一部とすべてやってみました。
user_agent = 'User-Agent":"Mozilla/5.0 (Windows NT 10.0; (略)~
header = {'User-Agent':user_agent}
または
header = {'User-Agent':'Mozilla/5.0'}
response = requests.get(file_url, headers=header)
または
response = requests.get(file_url)
print(response)
urllib.request.urlretrieve(file_url, save_path) →中身のない空のファイルが作成されます
file_urlは下記のような感じです。
ダウンロード前csvのfile_url
https://xxxxx.co.jp/maketext.php?type=xxxx&date=2024-08-31+06%3A00%3A00&mode=0
一度ダウンロードしたpdf(pdfはダウンロード済しかサンプルがないのですが、どちらにしても404です)
https://xxxxx.co.jp/openlist.php?file=xxxx-20240831075123.pdf
一度ダウンロードしたcsv
https://xxxxx.co.jp/opentext.php?file=xxxx-20240831075123.csv
自分で試したこと
・header = {'User-Agent':'xxx'}でユーザーエージェントを指定した
・待機時間を取ってみた
該当のサイトは特にスクレイピング禁止という記述はないようです。
ブラウザで見るfile_urlとダウンロードするurlが違うかも?とかいう例も見かけましたが、youtube動画と検索を駆使して手探りでやっているド素人なので、その調べ方もよくわからずで…
コード自体に問題があるのか、他に何か足りないものがありそうなのか、ヒントをいただけると嬉しいです。
初投稿なので、不備がありましたらすみません。
よろしくお願いいたします。
・コードの内容
客先のサイトにログインし、メニュー別に未取得のpdf・csvをDLする
(responseが取得できないので、保存するコードはコメントにしてあります)
・コード全体の流れ
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import requests
import os
import urllib.request
driver_path = r"C:\Users\xxxxx\chromedriver.exe"
driver = webdriver.Chrome()
driver.implicitly_wait(3)
driver.get("https://xxxxx.co.jp/")
# ****************************************************
driver.switch_to.frame("base")
text_box = driver.find_element(By.NAME,"userid")
text_box.send_keys("xxxxx")
text_box = driver.find_element(By.NAME,"passwd")
text_box.send_keys("xxxxx")
btn = driver.find_element(By.NAME,"cmdLogin")
btn.click()
def dl(p_name):
driver.switch_to.default_content()
driver.switch_to.frame("base")
driver.switch_to.frame("menu")
menu_link = driver.find_element(By.LINK_TEXT,f'{p_name}')
menu_link.click()
driver.switch_to.default_content()
driver.switch_to.frame("base")
driver.switch_to.frame("contents")
if not p_name.endswith('情報') :
link_text = 'pdf帳票発行'
else:
link_text = 'csvデータ作成'
DL_links = driver.find_elements(By.PARTIAL_LINK_TEXT,f'{link_text}')
download_dir = r"C:\Users\xxxxx"
for i, link in enumerate(DL_links):
file_url = link.get_attribute('href')
print(f'file_url:{file_url}')
file_name_in_url = file_url.split('file=')[-1]
match = file_name_in_url[4:17]
if p_name.endswith('情報') :
file_name = file_name_in_url
else:
file_name = f"{p_name}{match}.pdf"
save_path = os.path.join(download_dir, file_name)
header = {'User-Agent':'Mozilla/5.0'}
response = requests.get(file_url, headers=header)
print(response)
# urllib.request.urlretrieve(file_url, save_path)
time.sleep(3)
dl('納入指示情報')
dl('納入指示')
driver.quit()
変数ごとに内容を確認すると、response以外は正しく取得できているように見えました。
名前を付けて保存の部分を有効にしても、ファイルが空になるだけでスクリプト自体はエラーなく終了します。