前提
あるサイトをスクレイピングしているのですが、その中で画像もダウンロードさせるような処理を入れたいのですが、img src="" のsrcの中身がxxx.jsp?key=atai となっているためダウンロード出来ません。
ダウンロードは不可能でしょうか?何か方法はありますか?
ちなみに出来れば、ダウンロードせずに画像認識させて読み取った文字を文字列としてcsvに書き込む処理をしたいです。
個別ではPCに手動で画像を保存したものを画像認識させて、文字列として返すことに成功しております。
実現したいこと
ここに実現したいことを箇条書きで書いてください。
- ▲▲機能を動作するようにする
発生している問題・エラーメッセージ
例外が発生しました: UnidentifiedImageError cannot identify image file <_io.BytesIO object at 0x0000023644506BB0>
該当のソースコード
python
1# 1.動的サイトにアクセス 2url = "https://www.xxx/aaa/page" 3driver.get(url) 4 5# クリック前のハンドルリスト 6handles_befor = driver.window_handles 7 8# ドロップダウンを選択する 9# 分類 10genres = driver.find_element(By.NAME,'searchCategory') 11select1 = Select(genres) 12all_options = select1.options 13count = len(all_options) 14 15 16# [検索]ボタン押す 17driver.find_element(By.ID,'search').click() 18# メーカー毎の商品リストをfor文で回しながら取得 19pages = driver.find_element(By.XPATH, '//*[@id="fm"]/div[2]/span[2]') 20# ページャー数分、回す 21pagenum = pages.text 22for num in range(int(pagenum)): 23 # tbodyの中身取得 24 tbody = driver.find_element(By.XPATH,'//*[@id="xxx_list"]/table/tbody') 25 trlist = tbody.find_elements(By.TAG_NAME,'tr') 26 27 trnum = str(1) 28 for tr in trlist: 29 tdlist = tr.find_elements(By.TAG_NAME,'td') 30 trtext = [] 31 for td in tdlist: 32 test = td.text 33 if(test == '選ぶ'): 34 break 35 trtext.append(test) 36 # 1アイテム毎にCSVに書き込む 37 filename = "xxx.csv" 38 with open(filename, mode="a", encoding="utf-8") as f: 39 trs = ','.join(trtext) 40 f.write(trs) 41 # 改行コード 42 f.write('\n') 43 time.sleep(2) 44 #[選ぶ]をクリック 45 imgxpath = '//*[@id="result_list"]/table/tbody/tr['+ trnum +']/td[5]/a' 46 driver.find_element(By.XPATH, imgxpath).click() 47 # 画像URL取得 48 img = driver.find_element(By.XPATH,'//*[@id="aaa"]/p/img') 49 src = img.get_attribute('src') 50 #imgurlをダウンロード 51 if src: 52 src = urljoin(url, src) 53 # 画像のバイト列取得 54 img_content = requests.get(src).content 55 # 画像に変換 56 img_file = io.BytesIO(img_content) 57 # 画像の表示 ここでエラー発生 58 img_open = Image.open(img_file) 59 # 画像の保存 60 img_open.save(f'{trnum}_{trtext[2]}.png') 61
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
質問のコードでは省かれていますが、おそらく、以下の様な処理があるのだと思います。
url = 'https://...'
driver.get(url)
ここで、url がスクレイピング対象の URL だとすると、urljoin を使うことで正規化された URL を取得することができます。
from urllib.parse import urljoin
src = img.get_attribute('src')
#imgurlをダウンロード
if src:
 src = urljoin(url, src)
  :
すみません。
driver.get()では、画像URLではなく検索ボタン押す前のURLとなっております。
src が 画像URLとなっており、
このsrcの中身が""aaa/bb/xx.jsp?key=atai" という風になっております。
ページ移動はしていないので、
url = "https://www.xxx/aaa/page"
としておいて urljoin を実行すればよいかと思います。
ありがとうございます。
urlと定義し、
if src:
            src = urljoin(url, src)
としましたが、やはり同じところでエラーが発生いたします。
img_open = Image.open(img_file) ←ここで発生
何度も申し訳ございません。
srcの中身のURLを確認したところ、ディレクトリが少し違うようでした。
srcの中身
https://www.xxx.com/AAA/view/_aaa.jsp?key=atai
driver.getのURL
https://www.xxx.com/AAA/bb
なるほど、src の中身の URL はもともと正規化されている形式なのですね。そうなりますと、urljoin の処理は不要になります。原因としては、ダウンロードしたファイルは画像ではないか、Pillow では認識できないフォーマットの画像という事になりそうです。
ちなみにoctoparseというツールでダウンロードさせたところ、確かにダウンロード出来たものの画像とは認識されませんでした。
これは実現は出来ないもので、あきらめた方が良いでしょうか?
手動で画像をマウスでドラッグしたら、pngで保存され、これ自体の画像認識は出来ました。
正確な URL を教えてもらえるのであれば、こちらで動作確認できるのですが、どうしますか?
プライバシーにかかわるので避けたいのですが、あとで削除してもよいでしょうか?
URLは下記です。
xxx
画像は検索後に出てくる「選ぶ」ボタンとなります。
そのあとの金額の画像6,000円という画像を文字列としてcsvに保存したいです。
まずはダウンロードできるか試していました。
ありがとうございます、削除していただいて構いません。こちらで動作確認します。
ありがとうございます。削除リクエストとなりましたので、伏せました。
お手数おかけします。よろしくお願い致します。

回答1件
あなたの回答
tips
プレビュー
