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

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

ただいまの
回答率

89.06%

urllibも用いた画像取得のurl, header指定周りのバグ解決

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 57

Uga

score 10

前提・実現したいこと

python3のurllibを使ってgoogle画像の保存

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

フォルダは作られるが, 画像が保存されていない.

実行した結果, 以下のような出力のみでした.

エラーが0件中、0件発生しました。
エラーが0件中、0件発生しました。
エラーが0件中、0件発生しました。
エラーが0件中、0件発生しました。
エラーが0件中、0件発生しました。

import cv2, os, re,requests, time, bs4
from urllib.request import urlretrieve
from urllib import request as req
from urllib import error,parse
from PIL import Image
import numpy as np
import glob

members = ["(具体的な名前)","(具体的な名前)","(具体的な名前)","(具体的な名前)","(具体的な名前)"]

img_dir = "./Pictures/"

for member in members:
    dir_path = img_dir + member
    if not os.path.exists(dir_path):
        os.makedirs(dir_path)

    urlKeyword = parse.quote(member)
    url = 'https://www.google.com/search?hl=jp&q=' + urlKeyword + '&btnG=Google+Search&tbs=0&safe=off&tbm=isch'

    headers = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",}
    request = req.Request(url=url, headers=headers)
    page = req.urlopen(request)

    html = page.read().decode('utf-8')
    html = bs4.BeautifulSoup(html, "html.parser")
    elems = html.select('.rg_meta.notranslate')
    counter = 0
    error_counter = 0

    for ele in elems:
        ele = ele.contents[0].replace('"','').split(',')
        eledict = dict()
        for e in ele:
            num = e.find(':')
            eledict[e[0:num]] = e[num+1:]
            imageURL = eledict['ou']
        try:
            file_path = dir_path + "/" + str(counter)+".jpg"
            urlretrieve(imageURL, file_path)
            counter += 1        
        except Exception as e:
            error_counter += 1
        if counter == 1:
            print(member+"のダウンロードを開始します")
        if counter==200:
            break
    print("エラーが{}件中、{}件発生しました。".format(counter, error_counter))

試したこと

urlは無事に生成されているようですが,
調べたところelemsの要素が空のようでした.10~20行目に原因があるかと思いますが, わかりません.
headerは参考にしたサイトのままにしたのですが使用しているOSによって変わったりするものなのでしょうか.

補足情報(FW/ツールのバージョンなど)

macOS 10.13.6
jupyter notebook python3

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • meg_

    2020/08/02 11:23

    「調べたところelemsの要素が空のようでした.」とありますが、実際にはどんな値になっているのですか?

    キャンセル

  • Uga

    2020/08/02 11:29

    二つ目のfor節の直前にprint(elems)そ挿入したところ[]が帰ってきました. ですので, for ele in elems節は実際には実行されていないかと思います.

    キャンセル

  • meg_

    2020/08/02 11:39

    変数htmlの中に検索したい要素は含まれていますか?なければ検索できません。
    googleはスクレイピング禁止かと思いますので具体的には回答できませんが。

    キャンセル

回答 1

0

members=[]に何が格納されているのかはわかりませんが
['犬','猫','さる','虎','キリン']と適当に代入し、htmlを覗いてみましたが
.rg_meta .notranslateといったクラスでは画像を抽出できる様には思えませんでした。

抽出の対象とするクラスを改めてみてはいかがでしょうか。
またgoogle画像検索は使用上、対象の画像を1度クリックしなければ正規な画像のリンクは出現せず
そのまま埋め込まれた画像を抽出しようとしてもサイズの小さいサムネイル画像しか抽出は出来ないと思います。

もちろんelems = html.select()で親div等を取り出し、それぞれ画像をクリックした際に生成される「https://www.google.com/imgres?imageurl=...」のリンクを作り出し、ループ文で元画像を取り出す事も可能かとは思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る