質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

1012閲覧

画像スクレイピングでFileNotFoundErrorと出ることについて

退会済みユーザー

退会済みユーザー

総合スコア0

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2021/04/03 07:08

編集2021/04/03 08:10

前提・実現したいこと

Pythonを使って画像スクレイピングをしていました
以下のコードを実行して’プログラミング’の画像を取得していたのですがエラーが出てしまいます

発生している問題・エラーメッセージ

FileNotFoundError Traceback (most recent call last) <ipython-input-1-5505e60c047c> in <module> 80 t.write(image.content) 81 else: ---> 82 with open(IMAGE_DIR + title_name + '.jpg', 'wb') as t: 83 t.write(image.content) 84 FileNotFoundError: [Errno 2] No such file or directory: './プログラミング/子供/小・中学生のプログラミング教室|スタープログラミングスクール.jpg'

該当のソースコード

import os
from time import sleep

import pandas as pd
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

url = 'https://search.yahoo.co.jp/image'

options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)

driver.get(url)

sleep(2)

key = input('何の画像を取得しますか? > ')

search = driver.find_element_by_class_name('SearchBox__searchInput')
search.send_keys(f'{key}')

sleep(1)

search.submit()

last_height = driver.execute_script("return document.body.scrollHeight")

while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
sleep(2)
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height

contents = driver.find_elements_by_class_name('sw-Thumbnail')

print(f'{len(contents)}個の画像が見つかりました')

d_list = []

for content in contents:
figure = content.find_element_by_tag_name('figure')
image = figure.find_element_by_tag_name('img').get_attribute('src')
title = figure.find_element_by_tag_name('img').get_attribute('alt')
link = content.find_element_by_class_name('sw-ThumbnailGrid__details').get_attribute('href')

d = { 'title': title, 'image': image, 'link': link } d_list.append(d)

quit()

df = pd.DataFrame(d_list)
df.to_csv(f'{key}_image.csv', index=None, encoding='utf-8-sig')

Folder = input('フォルダー名は何にしますか? > ')

IMAGE_DIR = f'./{Folder}/'

if os.path.isdir(IMAGE_DIR):
pass
else:
os.makedirs(IMAGE_DIR)

df = pd.read_csv(f'{key}_image.csv')

for title_name, yahoo_image in zip(df.title, df.image):
image = requests.get(yahoo_image)
with open(IMAGE_DIR + title_name + '.jpg', 'wb') as t:
t.write(image.content)

sleep(2)

print(f'{key}の画像を取得しました')

Python

試したこと

もともと .jpg というのがあるからだめなのかと思いifでやってみたのですが、何も変わりませんでした

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/03 07:13

コードを実行しているフォルダ以下に「/プログラミング/子供/」というフォルダはありますか?
退会済みユーザー

退会済みユーザー

2021/04/03 08:05

多分ないと思います
guest

回答1

0

ベストアンサー

open()でファイルを新規作成する場合、ディレクトリがあらかじめ作成されている必要がありますが、
ファイル名に「/」や「\」等のパス区切り文字列が含まれていると、その部分以下が子ディレクトリと認識され、
そのディレクトリが存在しない場合にFileNotFoundErrorが発生します。

上記では、「プログラミング」というディレクトリしか存在しない(その下の「子供」というディレクトリが存在しない)にもかかわらず
「子供/小・中学生のプログラミング教室|スタープログラミングスクール.jpg」というファイル名を指定した結果
「./プログラミング/子供/」というディレクトリ下に新規ファイルを作成しようとしたのがFileNotFoundErrorの原因です。

その他、区切り文字以外にも、ファイル名に使用できない文字列があると他のエラーが発生することがあります。

したがって、下記のように、 re.subを使って、ファイル名からエラーの原因となる文字を削除するようにするとうまく行くと思います。

import re (略) for title_name, yahoo_image in zip(df.title, df.image): image = requests.get(yahoo_image) with open(IMAGE_DIR + re.sub(r'[\/:*?"<>|]+','',title_name) + '.jpg', 'wb') as t: (以下略)

投稿2021/04/03 08:36

編集2021/04/03 08:43
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/04/03 08:45

できました!!! まじでありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問