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

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

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

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

Q&A

解決済

1回答

2587閲覧

Pythonスクレイピングで画像をダウンロードするときに枚数制限をかけるには

退会済みユーザー

退会済みユーザー

総合スコア0

スクレイピング

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Python

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

0グッド

0クリップ

投稿2017/12/06 04:58

###前提・実現したいこと
以下のブログ記事の参考にPythonスクレイピングで画像をダウンロードしようとしています。下記のコードを実行すると、画像が大量にダウンロードされるのですが、例えば20枚など枚数制限をかけるにはコードをどのように変更すれば良いでしょうか。

ブログ記事

###該当のソースコード

python

1# coding: utf-8 2 3import os 4import sys 5import traceback 6from mimetypes import guess_extension 7from time import time, sleep 8from urllib.request import urlopen, Request 9from urllib.parse import quote 10from bs4 import BeautifulSoup 11 12MY_EMAIL_ADDR = 'sample@sample.co.jp' 13 14class Fetcher: 15 def __init__(self, ua=''): 16 self.ua = ua 17 18 def fetch(self, url): 19 req = Request(url, headers={'User-Agent': self.ua}) 20 try: 21 with urlopen(req, timeout=3) as p: 22 b_content = p.read() 23 mime = p.getheader('Content-Type') 24 except: 25 sys.stderr.write('Error in fetching {}\n'.format(url)) 26 sys.stderr.write(traceback.format_exc()) 27 return None, None 28 return b_content, mime 29 30fetcher = Fetcher(MY_EMAIL_ADDR) 31 32def fetch_and_save_img(word): 33 data_dir = 'data/' 34 if not os.path.exists(data_dir): 35 os.makedirs(data_dir) 36 37 for i, img_url in enumerate(img_url_list(word)): 38 sleep(0.1) 39 img, mime = fetcher.fetch(img_url) 40 if not mime or not img: 41 continue 42 ext = guess_extension(mime.split(';')[0]) 43 if ext in ('.jpe', '.jpeg'): 44 ext = '.jpg' 45 if not ext: 46 continue 47 result_file = os.path.join(data_dir, str(i) + ext) 48 with open(result_file, mode='wb') as f: 49 f.write(img) 50 print('fetched', img_url) 51 52 53def img_url_list(word): 54 """ 55 using yahoo (this script can't use at google) 56 """ 57 url = 'http://image.search.yahoo.co.jp/search?n=60&p={}&search.x=1'.format(quote(word)) 58 byte_content, _ = fetcher.fetch(url) 59 structured_page = BeautifulSoup(byte_content.decode('UTF-8'), 'html.parser') 60 img_link_elems = structured_page.find_all('a', attrs={'target': 'imagewin'}) 61 img_urls = [e.get('href') for e in img_link_elems if e.get('href').startswith('http')] 62 img_urls = list(set(img_urls)) 63 return img_urls 64 65if __name__ == '__main__': 66 word = sys.argv[1] 67 fetch_and_save_img(word)

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1for i, img_url in enumerate(img_url_list(word)):

ここのループの中でダウンロードを繰返している様ですから、その回数をチェックすれば良いでしょう。

こんな感じで。

python

1downloaded = 0 2for i, img_url in enumerate(img_url_list(word)): 3 downloaded+=1 4 if downloaded==20: 5 break 6

投稿2017/12/06 12:47

KojiDoi

総合スコア13671

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

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

退会済みユーザー

退会済みユーザー

2017/12/07 01:29

ご回答いただきましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問