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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

470閲覧

画像スクレイピングがうまくいきません。

taka-ken

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/09/04 02:37

私はpython経験半年の者です。

ポケモンの画像を1000枚、Googleからスクレイピングしようと以下のコードを作りました。

しかし、実際に以下のコードを実行してみるとWeb上の1〜20番目の画像だけが50回分スクレイピングされてしまいました。

import requests from bs4 import BeautifulSoup import lxml import urllib.request import os import ssl ssl._create_default_https_context = ssl._create_unverified_context # https://shinespark.hatenablog.com/entry/2015/12/06/100000 # PEP 0476に従い、Python2.7.9以降はSSL証明書が正しくない場合にはデフォルトでSSL認証エラーを出すようになった模様。 for num in range(50): # rangeで画像の量を選択:50×20=1000枚 headers = {"User-Agent":"hoge"} URL = 'https://www.google.com/search?q=%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3+%E9%9B%86%E5%90%88&source=lnms&tbm=isch&sa=X&ved=0ahUKEwi1lLGP_7XkAhXKGaYKHXNJBHgQ_AUIEigB&biw=1280&bih=720' # URLは画像検索したトップのURLをコピペする resp = requests.get(URL, timeout=1, headers=headers) soup = BeautifulSoup(resp.text, "lxml") imgs = soup.find_all("img") for i in range(len(imgs)): x = "pokemon" #↑ディレクトリ名はその都度変更するように! dir_name = "./data/{0}".format(x) if not os.path.exists(dir_name): os.makedirs(dir_name) filepath = dir_name + "/{0}-{1}.jpg".format(num,i) urllib.request.urlretrieve(imgs[i]["src"],filepath) #実行方法:python download2.py

エラーは出ませんでした。
Web上の画像1〜1000番目までをスクレイピングするにはどうしたらよいでしょうか?

コメントアウト部分が多く大変見づらいとは思いますが、ぜひご教授いただければ幸いです。

よろしくお願い致します。

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

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

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

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

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

t_obara

2019/09/04 02:48

># rangeで画像の量を選択:50×20=1000枚 この20の部分はどこに記載されているのでしょうか?
taka-ken

2019/09/04 02:52

t_abaraさん 何もコードに書いていないのにもかかわらず、20として処理されている状況です。
guest

回答1

0

ベストアンサー

python

1for num in range(50): # 50回繰り返す 2 # Webページ取得 3 resp = requests.get(URL, timeout=1, headers=headers) 4 # Web上の画像を取得 5 imgs = soup.find_all("img") # ここでは20件しか表示されていない 6 # imgsを保存

なので、当然その動作かと思います。
Google 画像検索のページはスクロールによって ajax で非同期に次のページを読み込んでいるようなので、スクロールしない限り20枚目以降の結果は取得できなさそうです。

が、そもそも画像検索に関してはAPIが用意されているので、スクレイピングよりそちらの利用を推奨します。
https://developers.google.com/custom-search/v1/overview

スクレイピングは API などが用意されていない等の理由でとる最後の手段という意味が強く、
デメリットも多いのでAPIがあるのであればそちらの利用を推奨します。

デメリット

取得先の相手が望まない形のアクセスとなる
  • Sleepや適切なコードを書いても訴訟になったケースあり
壊れやすい
- 相手先でHTMLの構造を変えられると容易に壊れる
JavaScript やブラウザまでエミュレートすると動作が遅い

投稿2019/09/04 02:48

編集2019/09/04 03:14
unhappychoice

総合スコア1531

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

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

taka-ken

2019/09/04 03:03

unhappychoiceさん 他の方法(API)までお示ししていただいてありがとう御座います。 Googleの場合、スクロールしない限り20枚目以降の結果は取得できないというのは初めて知りました。yahooでしたらうまくいくでしょうか?
unhappychoice

2019/09/04 03:13

Yahoo もボタンを押すタイプですが同様です。 回答に追記しましたが、スクレイピングはデメリットが多いので API の利用を推奨します。
taka-ken

2019/09/04 03:38

unhappychioceさん そうなんですね。ありがとう御座います。 APIを試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問