dill_mame
@dill_mame

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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以外は正しく取得できているように見えました。
名前を付けて保存の部分を有効にしても、ファイルが空になるだけでスクリプト自体はエラーなく終了します。

0

1Answer

file_urlは下記のような感じです。

実際のURLを提示されることは可能でしょうか?404エラーということはURLが間違っているのでは?とも思いますが質問文からはよく分かりませんね。

file_urlは取得できているので、frameの切り替えまではできているようです。

どういうサイトで何がどこまで成功しているのかサイトとコード全体を載せられると回答がつきやすくなるかと思います。

0Like

Comments

  1. @dill_mame

    Questioner

    @megchandesu 様、コメントありがとうございます。
    実際に取引をしている客先のサイトでログインも必要なのでそのものすべてを載せることができないのですが、file_url = link.get_attribute('href') としたときのfile_urlの内容とマウスでポイントしたときの内容は同一でした。

    可能な限りの情報を付け加えるようにします。

  2. マウスでポイントしたときの内容は同一でした。

    クリックした場合に表示されるURLとも同じということでしょうか?
    seleniumでやってみても同様に404エラーとなるのでしょうか?

  3. ・header = {'User-Agent':'xxx'}でユーザーエージェントを指定した

    言語やロケーションを追加すると上手くいく場合もあるようです。
    Error in Downloading live pdf file from URL in python
    必要な設定については先方に確認した方が早いかと思います。

  4. @dill_mame

    Questioner

    @megchandesu 様、コメントありがとうございます。
    不慣れなもので、コメントに気付かずすみません。

    クリックした場合に表示されるURLとも同じということでしょうか?
    seleniumでやってみても同様に404エラーとなるのでしょうか?

    そうです。
    404になってしまいます。

    言語やロケーションを追加すると上手くいく場合もあるようです。
    Error in Downloading live pdf file from URL in python
    必要な設定については先方に確認した方が早いかと思います

    別の適当なサイトで同じようなコードを書いて実行してみたら問題なくDLできたので、別途確認が必要なのかもしれませんね…ありがとうございます。

Your answer might help someone💌