

1．以下のサイトから11月7日の野菜価格csvファイルのみをダウンロードしたい。  
<https://www.seisen.maff.go.jp/seisen/bs04b040md001/BS04B040UC020SC001-Evt001.do>

サイト自体は以下のように誰でもデータをダウンロードできる。

[![画像の説明をここに入力](https://i.stack.imgur.com/8anQD.png)](https://i.stack.imgur.com/8anQD.png)

2．以下のエラーが出て、ダウンロードまでに至らない。

[![画像の説明をここに入力](https://i.stack.imgur.com/ipMnB.jpg)](https://i.stack.imgur.com/ipMnB.jpg)

上記自己解決

[code]

    elems = browser.find_element(By.XPATH, "//a[@href]")
    
[/code]

下記に変更

[code]

    elems = browser.find_elements(By.XPATH, "//a[@href]")
    
[/code]

再びエラー発生

[![画像の説明をここに入力](https://i.stack.imgur.com/p3yoi.jpg)](https://i.stack.imgur.com/p3yoi.jpg)

3．以下実行コード

[code]

    from selenium import webdriver
    import os
    import time
    import csv
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    import urllib.request
    
    try:
        browser = webdriver.Chrome()
        browser.get("https://www.seisen.maff.go.jp/seisen/bs04b040md001/BS04B040UC020SC001-Evt001.do")
        
        elems = browser.find_elements(By.XPATH, "//a[@href]")
        print(elems)
        count = 1
        
        for elem in elems:
            download_url = elem.get_attribute("href")
            print(download_url)
            urllib.request.urlretrieve(download_url, str(count))
            print("ダウンロード　ファイル数: "+str(count))
            
            time.sleep(3)
            count = count + 1
    
    except Exception as ex:
        print(ex)
    
[/code]

  4. 言語、バージョン  
Python 3.9.12  
selenium 4.6.0


CC BY-SA 4.0
2022-11-09T13:04:13.190
92112
2022-11-10T09:13:32.723
2022-11-09T23:45:34.137
48948
48948
question
python web-scraping
サイトからスクレイピングでcsvファイルをダウンロードしたい。


何故かは不明ですが、質問に記述されたURLだと、Chromeブラウザの手作業ではページが表示されるのですが、当方の環境(Windows10
Python3.11.0)でのseleniumだと表示されない状態ですね。  
@cubick さん指摘のURLなら作業が進められたので、以下のようにしてみました。

[code]

    from selenium import webdriver
    import os
    import time
    import csv
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    import urllib.request
    import traceback #### 詳細な traceback の表示用
    
    try:
        browser = webdriver.Chrome()
        # browser.get("https://www.seisen.maff.go.jp/seisen/bs04b040md001/BS04B040UC020SC001-Evt001.do") #### seleniumだと上手くいかない
        browser.get("https://www.seisen.maff.go.jp/seisen/bs04b040md001/BS04B040UC020SC998-Evt001.do") #### @cubick さん指摘のURL
        
        #### 左上・年月日の並びの一番上をクリック
        browser.find_element(By.XPATH, '//*[@id="s007_Evt001_0"]').click()
        time.sleep(2)
        
        #### 表示された表の項目タイトルを含む行数を取得
        elems = len(browser.find_elements(By.XPATH, '//*[@id="content_whitemenu"]/div/table/tbody/tr/td[2]/div[2]/table/tbody/tr'))
        
        #### 表の項目タイトルを除いた2行目から最後までを繰り返し実行
        for row in range(2,(elems + 1)):
            #### 都市名取得
            cityname = browser.find_element(By.XPATH, f'//*[@id="content_whitemenu"]/div/table/tbody/tr/td[2]/div[2]/table/tbody/tr[{row}]/td[2]').text
            #### 野菜のCSVダウンロードリンクをクリック
            browser.find_element(By.XPATH, f'//*[@id="content_whitemenu"]/div/table/tbody/tr/td[2]/div[2]/table/tbody/tr[{row}]/td[3]/a[2]').click()
            print(f'ダウンロード：{cityname}')
            time.sleep(3)
        
        browser.quit() #### 終了時 webdriver 停止
    except Exception as ex:
        print(traceback.format_exc()) #### 詳細な traceback の表示
    
[/code]


CC BY-SA 4.0
2022-11-10T06:02:38.937
92125
2022-11-10T06:02:38.937
26370
92112
answer


ウェブブラウザの Developer Tools を利用すれば判りますが、リンクは JavaScript による form submit
になっています(HTTP POST)。それらを考慮すると、以下の様にしてもデータの取得は可能です。

[code]

    import sys
    import re
    import requests
    from bs4 import BeautifulSoup
    import urllib.request
    
    url = 'https://www.seisen.maff.go.jp/seisen/bs04b040md001/BS04B040UC020SC001-Evt001.do'
    the_day = '20221107'
    r = requests.get(f'{url}?s006.dataDate={the_day}')
    r.encoding = r.apparent_encoding
    soup = BeautifulSoup(r.text, 'html.parser')
    
    tbl = soup.select_one('div.scr1 > table')
    if tbl is None:
        print('not found table', file=sys.stderr)
        sys.exit(1)
    
    # 都市名
    cities = [c.text.strip() for c in tbl.select('td:nth-child(2)')[1:]]
    
    # 野菜データ(CSV)
    csv_url = 'https://www.seisen.maff.go.jp/seisen/bs04b040md001/BS04B040UC020SC001-Evt005.do'
    for i, elm in enumerate(tbl.select('tr td:nth-child(3) a:-soup-contains("CSV")')):
        no = re.search(r",\s*'(.+?)'", elm['href']).group(1)
        urllib.request.urlretrieve(f'{csv_url}?s004.chohyoKanriNo={no}', f'{(i+1):02d}_{cities[i]}_{the_day}.csv')
    
[/code]

**実行後**

[code]

    $ ls -1 *.csv
    01_主要卸売市場計_20221107.csv
    02_仙台市_20221107.csv
    03_東京都_20221107.csv
    04_横浜市_20221107.csv
    05_金沢市_20221107.csv
    06_名古屋市_20221107.csv
    07_京都市_20221107.csv
    08_大阪市_20221107.csv
    09_神戸市_20221107.csv
    10_広島市_20221107.csv
    11_高松市_20221107.csv
    12_北九州市_20221107.csv
    13_福岡市_20221107.csv
    14_沖縄県_20221107.csv
    15_札幌市_20221107.csv
    
[/code]


CC BY-SA 4.0
2022-11-10T09:13:32.723
92131
2022-11-10T09:13:32.723
47127
92112
answer