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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1437閲覧

画像スクレイビングがうまくできない

gurou

総合スコア8

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ダウンロード

リモートシステムからローカルシステムへとデータを受信する事、もしくはそのようなデータ転送を行う事をダウンロードと呼びます。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/07/06 07:20

編集2020/07/06 07:53

画像スクレイビングを用いて、写真をダウンロードしたいです。
以下のURLを参考にしました。
https://webdirector-blog.com/c_3/p_38/

以下のURL上のコードでは無事に、女性の写真をDLすることができたのですが
URLだけを変更しても、
写真をDLすることができず、ファイルが大量にできただけでした。

どのようにすればよいのでしょうか

import os import bs4 import time import random import urllib.request from itertools import chain base_url = 'https://search.yahoo.co.jp/image/search?p=%E7%8A%AC&oq=&ei=UTF-8&save=0' def fetch_page_urls(int, page): page_path = '/CSP/bt/hairCatalogSearch/ladys/condtion/?lengthCd=HL0'+str(int)+'&pn='+str(page) html = urllib.request.urlopen('{}{}'.format(base_url, page_path)) soup = bs4.BeautifulSoup(html, 'html.parser') columns = soup.find_all('li', class_='dibBL') atags = map(lambda column: column.find_all('a', class_='pr'), columns) with open('hotpepper_page_urls_type'+str(int)+'.txt', 'w') as f: for _ in chain.from_iterable(atags): path = _.get('href') if not path.startswith('https'): # Relative path path = '{}{}'.format(base_url, path) if path[-1] == '/': # Normalize path = path[:-1] f.write('{}\n'.format(path)) def fetch_photos(int, page): with open('hotpepper_page_urls_type'+str(int)+'.txt') as f: # Make directories for saving images dirpath = 'photos/inu/lenHL0'+str(int)+'/'+str(page) # ファイルの存在確認 if os.path.isfile('{}/{}'.format(dirpath, '40.jpg')) == True: print('すでに取得済') return False # ディレクトリの存在確認 if os.path.isdir(dirpath) == False: os.makedirs(dirpath) num = 1 #imgのURLを取得 for url in f: html = urllib.request.urlopen(url.strip()) soup = bs4.BeautifulSoup(html, 'html.parser') photos = soup.select("div.pr img.bdImgGray") # photos = soup.find_all('div', class_='fl') paths = map(lambda path: path.get('src'), photos) #フォルダ保存 for path in paths: filepath = '{}/{}'.format(dirpath, str(num)+'.jpg') # Download image file urllib.request.urlretrieve(path, filepath) num = num +1 # Add random waiting time (4 - 6 sec) time.sleep(1 + random.randint(0, 2)) if __name__ == '__main__': for type in range(5, 6): for page in range(1, 101): print('type='+str(type)+'&page='+str(page)) fetch_page_urls(type, page) fetch_photos(type, page)

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

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

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

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

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

guest

回答2

0

ベストアンサー

掲題のコードはbase_urlのURLを変えれば利用できるというものではありません。

また、yahoo画像検索はスクレイピング行為が禁止されています。(下記リンク参照)

スクレイピング、クローリングする時の注意点

https://search.yahoo.co.jp/image/robots.txt
robots.txtファイルの使い方や記述方法を解説します

どうしてもコードを動かしてみたく、テストしてみたいといった場合には
対象のソースコードをコピーしてきて変数に代入してあげ
urllibやrequestsなどは使用せずリクエストを送らずにスクレイピングしてください。

python

1import bs4 2target = ''' 3 4<html lang="ja"> 5<head> 6 7中略 8 9</body> 10</html>''' 11 12soup = bs4.BeautifulSoup(target, 'html.parser') 13images = soup.find_all('img', {'alt':'「犬」の画像検索結果'}) 14for img in images: 15 print(img.get('rel').split('|')[0]) 16 print('='*50)

質問に掲載されていたURLの場合に
対象ページのソースをtargetに代入する事で
上記コードで対象の画像のURLまでを出力できるコードになっています。

しかし、質問者様の目的である

URLにアクセスして画像を保存

という動作はリクエストを送信してしまう動作となり
規約に違反してしまう為コードにはしておりません。
あくまでも参考までに。

投稿2020/07/06 11:01

nto

総合スコア1438

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

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

0

参考リンク先のコードはある特定のサイトでしか動作しません。

どのようにすればよいのでしょうか

まずはあなたがそのサイトに対してスクレイピングすることが許可されているかどうかを確認してください。

投稿2020/07/06 09:01

can110

総合スコア38233

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問