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

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

ただいまの
回答率

90.52%

  • Python

    11244questions

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

  • Python 3.x

    9365questions

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

Pythonスクレイピング 検索結果が変わる

解決済

回答 2

投稿

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

Lim-Nic

score 1

前提・実現したいこと

Pythonを使った画像検索・ダウンロードプログラムを作っています。
動作は出来ていますが、手動で検索した時と違う画像がダウンロードされて困っています。
始めたばかりでおかしな内容かもしれませんが、大目に見てください。

簡単な動作まとめ
①単語入力
②ダウンロード枚数
③bing画像検索ページで検索
④結果から画像URL取得
⑤ダウンロード

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

例えば、"ハリネズミ" と入力します。
手動でbing画像検索すると、1番にあおむけになったハリネズミが出てきますが
プログラムを実行すると、授乳しているハリネズミがダウンロードされます。
手動とプログラムでは、検索結果が異なる場合があると解説されていたサイトをいくつか見ましたが
プログラムでもまれに手動の検索結果と同じ画像をダウンロードしてくれる時があります。
出来ないなら出来ないで諦めがつきますが、何かきっかけがあって正常に動作するのであれば
そうしたいです。

ちなみに、プログラム中で"犬"と検索するとイノシシの年賀状画像が出てきます。これは本当に困ります。

よろしくお願いします。

該当のソースコード

import requests
import urllib.request
from bs4 import BeautifulSoup
import time

word = input("検索する言葉を入力してください。")
num =int(input("ダウンロードする数を入力してください。"))

#Bing画像検索サイト
url = "https://www.bing.com/?scope=images&FORM=Z9LH1"

#入力した言葉を検索
req = requests.get(url, params={"q":word})

res_url = str(req.url)

print(res_url)
print("\n------------------\n")


html = urllib.request.urlopen(res_url)

#BS4で読み取れる状態に変更
soup = BeautifulSoup(html,"html.parser")

#print(soup)
print("\n------------------\n")
elems = soup.select(".thumb")

#print(elems)

i = int(1)

for elem in elems:
    imgurl = elem.get("href")

    url = str(imgurl)

    file_name = "{0}{1}.jpg".format(word,i)
    print(file_name)

    print("Now Downloading...{0}/{1}".format(i,num))

    try:
        #画像をダウンロード
        urllib.request.urlretrieve(url,file_name)
    except:
        print("読み取れない画像でした。")
    else:
        i = i + 1
    finally:
        time.sleep(1)
        if i > num:
            break

print("End")

試したこと

手動で検索した画像がダウンロードできたとき、出来ない時でURLを比べてみましたが
内容は同じでした。
HTMLの内容も見比べてみましたが、検索するごとに変化すると思われる項目(GI,CurURL?)などしか
変化が見られず、画像内容など検索結果が書かれたところから内容が変わっています。
上記内で検証した後の出力動作が残っています。すみません。

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

Windows10
Python3.7.1
Anaconda3

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • tiitoi

    2019/04/12 17:10

    Google は規約でスクレイピングは禁止になっています。
    プログラムによる検索は対策がされており、最初の何回かはできますが、そのうちアクセス拒否されてしまうため、基本的に Google からスクレイピングはできないと考えて良いです。

    キャンセル

  • Lim-Nic

    2019/04/15 16:40

    返信遅くなりました。
    画像検索結果のURL読み取りまで、Seleniumで同じ動作を行ってみたところ
    結果通りに画像取得することが出来ました。ありがとうございます。
    動作中ブラウザを立ち上げないといけない欠点がありますが、今はこれで十分嬉しいです。
    ベストアンサーに選びたいのですが、よろしければ一度回答の欄に一言コメントして頂けませんか

    キャンセル

  • tiitoi

    2019/04/15 18:00

    回答のほうに転記しました。

    キャンセル

回答 2

checkベストアンサー

+1

ブラウザと同じ結果を得たい場合は selenium をお使いください。

from pathlib import Path
import time
import re

import requests
from bs4 import BeautifulSoup
from selenium import webdriver

driver = webdriver.Chrome(executable_path=r'F:\chromedriver_win32\chromedriver.exe')

word = '犬'
url = 'https://www.bing.com/?scope=images&q={}'.format(word)

# 保存するディレクトリ
out_path = Path('images')
out_path.mkdir(exist_ok=True)

driver.get(url)
soup = BeautifulSoup(driver.page_source, 'lxml')

def save_image(url, path):
    print("save {} as {}".format(url, path))
    res = requests.get(url)
    if res.status_code == 200:
        open(path, 'wb').write(res.content)


img_tags = soup.find_all('img', attrs={'src': True, 'class': 'mimg'})
for i, img_tag in enumerate(img_tags):
    save_name = '{}_{}.jpg'.format(word, i)  # 保存するファイル名
    save_path = out_path / save_name  # 保存するパス

    img_url = 'https://www.bing.com' + img_tag['src']
    if img_tag['src'].startswith('/th?'):
        save_image(img_url, save_path)

    time.sleep(0.3)

driver.close()

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

"犬"と検索するとイノシシの年賀状画像がスクレイピングされるというのは笑えますね。恐らく機械学習のために画像を大量にスクレーピングする人が増えたので、それへの対抗手段として、スクレイピングと思われるのには、機械学習に使えない画像を表示されるように細工しているのではないでしょうか。

今回の質問に対しては、正常な動作ですというしかないと思います。スクレイピングかどうかをどう判断しているかは企業秘密でしょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/15 11:10

    返信が遅くなってしまってすみません。
    せめて戌年であれば許せるんですが・・・笑

    各Webサイトで対策が取られているんですね。
    ご回答ありがとうございます。

    キャンセル

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

  • Python

    11244questions

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

  • Python 3.x

    9365questions

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