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

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

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

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

Python

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

Q&A

解決済

2回答

2888閲覧

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

Lim-Nic

総合スコア18

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2019/04/12 07:02

前提・実現したいこと

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

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

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

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

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

よろしくお願いします。

該当のソースコード

Python

1import requests 2import urllib.request 3from bs4 import BeautifulSoup 4import time 5 6word = input("検索する言葉を入力してください。") 7num =int(input("ダウンロードする数を入力してください。")) 8 9#Bing画像検索サイト 10url = "https://www.bing.com/?scope=images&FORM=Z9LH1" 11 12#入力した言葉を検索 13req = requests.get(url, params={"q":word}) 14 15res_url = str(req.url) 16 17print(res_url) 18print("\n------------------\n") 19 20 21html = urllib.request.urlopen(res_url) 22 23#BS4で読み取れる状態に変更 24soup = BeautifulSoup(html,"html.parser") 25 26#print(soup) 27print("\n------------------\n") 28elems = soup.select(".thumb") 29 30#print(elems) 31 32i = int(1) 33 34for elem in elems: 35 imgurl = elem.get("href") 36 37 url = str(imgurl) 38 39 file_name = "{0}{1}.jpg".format(word,i) 40 print(file_name) 41 42 print("Now Downloading...{0}/{1}".format(i,num)) 43 44 try: 45 #画像をダウンロード 46 urllib.request.urlretrieve(url,file_name) 47 except: 48 print("読み取れない画像でした。") 49 else: 50 i = i + 1 51 finally: 52 time.sleep(1) 53 if i > num: 54 break 55 56print("End")

試したこと

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

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

Windows10
Python3.7.1
Anaconda3

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

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

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

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

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

tiitoi

2019/04/12 07:10

Google、Bing などの検索結果は個々人にパーソナライズされた結果が表示されるので100人いたら100人違う結果が表示されることもあり得る。同じ検索結果を期待することがそもそも無理。
Lim-Nic

2019/04/12 07:18

色々なサイトで同じような内容を見ました。 ですが、手動と同じ画像をDLするときもあるんです。1回の検索で28枚検索結果がでて、全て順番も同じでした。 何故出来るときもあるのか、疑問です。 100やって100違う結果ならいいですが一致するときがあるからこそモヤモヤします。
tiitoi

2019/04/12 07:22

> 手動と同じ画像をDLするときもある 検索キーワードによっては一致するということですか?それとも同じ検索キーワードでも毎回変わるのですか? 検索キーワードによっては一致したり、しなかったりということであれば、1つ前のコメントに記載した通りです。 ブラウザで開いた場合は過去の検索履歴とかに影響されているのではないですか? 100人検索したら、100人とも異なるということを言っているのではなく、異なる結果が表示される人もいるかもしれないし、同じ結果が表示される人がいるかもしれない、Google や Bing はそのようになっています。
Lim-Nic

2019/04/12 07:31

>検索ワード 同じ内容を入れています。半角全角も変えていません。 >100人検索したら・・・ すみません。私の良い方が極端すぎました。個人によって好むと思われる内容が上位に来たりすることは分かります。 動作結果は基本的に2種類です。手動で検索した結果と同じか、プログラムで動いているときだけダウンロードされるもの。2:8程度でその結果になります。 検索ワードは変えずに、ダウンロード枚数を変えてみたり、PCを立ち上げなおしてみたり、何度も連続で動作させてみたりすると、なぜか突然結果が変わります。
tiitoi

2019/04/12 07:59

自分の環境でも確認しましたが、確かに5回に1回だけ結果が変わりますね。 全く同じプログラムを実行してそうなるということは bing 側の仕組みによるものでしょう。 なぜそうなるのかは bing のアルゴリズムがどうなっているかわからないので不明ですが、そういうものだと受け入れるしかないのではないでしょうか? ブラウザだとそのような事が起きないようなので、selenium を使うという手もありますが。。
Lim-Nic

2019/04/12 08:04

現象確認して頂いてありがとうございます。とても嬉しいです。 今回bingを使用しているのは、googleなどで画像検索すると、URL解析?BeautifulSoupで読み取りをするときに、403エラーがでてしまうからです。まだ解決まで至っていませんが、調べている最中です。 seleniumはまだ使ったことが無いので、一度調べてみます。ありがとうございます。
tiitoi

2019/04/12 08:10

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

2019/04/15 07:40

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

2019/04/15 09:00

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

回答2

0

ベストアンサー

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

python

1from pathlib import Path 2import time 3import re 4 5import requests 6from bs4 import BeautifulSoup 7from selenium import webdriver 8 9driver = webdriver.Chrome(executable_path=r'F:\chromedriver_win32\chromedriver.exe') 10 11word = '犬' 12url = 'https://www.bing.com/?scope=images&q={}'.format(word) 13 14# 保存するディレクトリ 15out_path = Path('images') 16out_path.mkdir(exist_ok=True) 17 18driver.get(url) 19soup = BeautifulSoup(driver.page_source, 'lxml') 20 21def save_image(url, path): 22 print("save {} as {}".format(url, path)) 23 res = requests.get(url) 24 if res.status_code == 200: 25 open(path, 'wb').write(res.content) 26 27 28img_tags = soup.find_all('img', attrs={'src': True, 'class': 'mimg'}) 29for i, img_tag in enumerate(img_tags): 30 save_name = '{}_{}.jpg'.format(word, i) # 保存するファイル名 31 save_path = out_path / save_name # 保存するパス 32 33 img_url = 'https://www.bing.com' + img_tag['src'] 34 if img_tag['src'].startswith('/th?'): 35 save_image(img_url, save_path) 36 37 time.sleep(0.3) 38 39driver.close()

投稿2019/04/15 09:00

tiitoi

総合スコア21956

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

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

0

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

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

投稿2019/04/12 08:35

YasuhiroNiji

総合スコア584

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

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

Lim-Nic

2019/04/15 02:10

返信が遅くなってしまってすみません。 せめて戌年であれば許せるんですが・・・笑 各Webサイトで対策が取られているんですね。 ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問