【Python】Google画像検索で画像のURLから類似画像、キーワードを検索

Episode #29

Google画像検索を使ってPythonから画像検索してみたい!と、思ったので備忘録ですね。ハマった点もいくつかあるので書いておきます。

GETメゾットについて

試しにURLで画像検索をしてみます。画像のURLを貼り付けて検索してみます1

するとこの画像の最良の推測結果や、そのキーワードが含まれるページが表示されます。これを取得したいというわけ。

キャプチャ

 


 

そこで、検索結果のページを取得しようとしたのですが。「google.com/search?入力したURL」とかかと思いきや全然関係ないURLでした…

3

どんな感じかな~と思い、パケットキャプチャしてみたらこんな感じでした

GET /searchbyimage?image_url=URL
&encoded_image=&image_content=&filename=&hl=ja
HTTP/1.1

なるほど。つまり/searchbyimageにGETを送信すればいいということですね!すると先ほどの関係ないURLに転送されるみたいです。

requestsライブラリで送信してみる

urllibでやろうと思っていたのですが、今回は現代風ライブラリの「Requests」というものを使ってみようかと思います!

インストール

pip install requests

Requestsのサイトはこちら

 

Requestsの簡単な使い方

#ライブラリのインポート
import requests

# GET
requests.get('URL')
# POST
requests.post('URL')

#ヘッダーでユーザーエージェント指定
headers = {'User-Agent': 'Mozilla Firefox'}
requests.get('URL', headers=headers)

#レスポンス表示
requests.get('URL', headers=headers).text

getもpostも一行で送信できます!これはかっこいい((

 

実際に送信してみる

bs4とrequestsをインポートした後、ヘッダーにUAを指定します。これをやらないと正しいページに転送してくれないので注意。

import requests
from bs4 import BeautifulSoup

headers = {
'User-Agent': 
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0'
}

 

そして画像のURLと検索する言語を指定したものを送信します

request = "https://www.google.co.jp/searchbyimage?image_url=%s&encoded_image=&image_content=&filename=&hl=%s" % (url,langage)

 

リクエストを送信したら自動で転送されるので、転送先のhtmlからbs4でキーワードを抜き取ります。

html = requests.get(request, headers=headers).text
soup = BeautifulSoup(html, 'html.parser') 
print soup.find_all("a", class_="_gUb", style="font-style:italic")[0].get_text()

 

同じ方法で類似画像も取得できます。あくまでご参考までに。一通りライブラリっぽくしたのをGitHubに置いておきますのでそちらもご覧ください。

GoogleImageSerch(Github)

NijiPicoをフォローして最新のFeedを入手