Python+selenium+pandsでURLからzipを取得し、zipファイル内のCSVを読み込みたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 81

Aquamarine

score 13

実現したいこと

ログインページ内のURLからzipファイルをダウンロードして、pandasで読み込みたい。
(その後、CSVのフォーマットを変換してto_csvで吐き出したい。)

前提

【環境】

  • CentOS7
  • Python3.6
  • selenium
  • chrome
  • pandas

【スクレイピング対象について】
ログイン後に特定のURLにアクセスすることで決まった名前のCSVファイルが入ったzipがダウンロードできます。
この時zipファイル「YYYYMMDD.zip」の中に「item.csv」が入っています。

【URLについて】
ダウンロードのURLは以下のような形式になっており、直接~.zipというURLではありません。
https://xxxxx.jp/sms/basic/download/article?date=YYYYMMDD&file_type=xxxxx=

困っていること

エラーメッセージの zipfile.BadZipFile: File is not a zip file からzipファイルではない何かを読み込んでいることが原因なことまでは理解できています。
調べてみたのですがURLから直接ファイルを読み込む形式では~.zipなど直接.zipで終わるURL以外のサンプルしか見つけられず、ここからどうして良いか分からず詰まっています。

コード

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import pandas as pd
from time import sleep
import chromedriver_binary
import os

# メールアドレスとパスワードの指定
id1 = "ID1"
pass1 = "password1"
id2 = "ID2"
pass2 = "pass2"

# ドライバを設定
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=options)

#ログイン
print("-----ログインを開始-----")
driver.get("https://xxxxx.jp/login")

# ID1入力
ele = driver.find_element_by_xpath('//*[@id="store-login-table"]/tbody/tr[1]/td/input')
ele.send_keys(id1)

#Password2入力
ele = driver.find_element_by_xpath('//*[@id="store-login-table"]/tbody/tr[2]/td/input')
ele.send_keys(pass1)

#Enterキーを押下
ele.send_keys(Keys.ENTER)

# 1秒間待機。
sleep(1)

# ID2入力
ele = driver.find_element_by_xpath('//*[@id="user-login-table"]/tbody/tr[1]/td/input')
ele.send_keys(id2)

#Password2入力
ele = driver.find_element_by_xpath('//*[@id="user-login-table"]/tbody/tr[2]/td/input')
ele.send_keys(pass2)

#Enterキーを押下
ele.send_keys(Keys.ENTER)

# 1秒間待機。
sleep(1)
print("タイトル" + driver.title)
print("-----ログイン成功-----")

# csvを読み込み
csv_date = pd.read_csv('https://xxxxx.jp/sms/basic/download/article?date=YYYYMMDD&file_type=xxxxx=',compression='zip')
print(csv_date)

エラー

Traceback (most recent call last):
  File "aggregate.py", line 70, in <module>
    csv_date = pd.read_csv('https://top-seller.jp/sms/basic/download/article?date=20190911&file_type=stock&price_flag=1&profit_flag=',compression='zip')
  File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 685, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 457, in _read
    parser = TextFileReader(fp_or_buf, **kwds)
  File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 895, in __init__
    self._make_engine(self.engine)
  File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 1135, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/usr/lib64/python3.6/site-packages/pandas/io/parsers.py", line 1917, in __init__
    self._reader = parsers.TextReader(src, **kwds)
  File "pandas/_libs/parsers.pyx", line 382, in pandas._libs.parsers.TextReader.__cinit__
  File "pandas/_libs/parsers.pyx", line 635, in pandas._libs.parsers.TextReader._setup_parser_source
  File "/usr/lib64/python3.6/zipfile.py", line 1131, in __init__
    self._RealGetContents()
  File "/usr/lib64/python3.6/zipfile.py", line 1198, in _RealGetContents
    raise BadZipFile("File is not a zip file")
zipfile.BadZipFile: File is not a zip file
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

zipファイルではない何かを読み込んでいることが原因なことまでは理解できています。

それがわかっているなら、何を読み込んだのか調べたらいいのでは?

というか、最初にSeleniumを使ってログインしておきながら、それを捨てて、いきなりpd.read_csv(~~)とは???
ログインが必要だから、ログインしたのでは?なので、そのままSeleniumでダウンロードすべきでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る