0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

スクレイピングで画像を集めてみよう

Last updated at Posted at 2022-09-11

注意

  • スクレイピングはまだ法律が決まっていないグレーな部分なのでするときは細心の注意を払いましょう。
  • 今回は多分セーフ。
  • やるときは法律を確認して、自己責任でお願いします。

はじめに

僕はすぐ記憶が無くなるので記事を書くことにしました。
あくまでも備忘録として書くので、「わかりにくい」 とかは受け付けません。
今回はROLANDさんの画像で機械学習をしたかったのでスクレイピングをします。

なぜスクレイピングなのか

「画像を集めるならbingのAPIでええやん」という人もいると思いますが。

「金がかかる」

この一言に尽きます。bingのAPIは最初は金がかからないのですが、30日経つと金がかかるようになるので、今後も使いまわすことを考えるとスクレイピングになりました。

今回、ぶち当たった課題

課題:検索画面から一つ一つ画像を取り出そうとすると、画像の表示数が限定されているので無限には取れない。
解決:画像の詳細ページから次の詳細ページに移ることで無限に取れる。

課題:次のページに移動する方法がurlじゃなくてbutton。
解決:Beautiful SoupじゃなくてSeleniumを使う。

コード

※注意

  • chrome driverをインストールしてコードにPathを書いてください。
  • これをJupyter Nootbookにコピペして、ファイルと同じ場所にdataって名前のフォルダを作成してください。
  • urlっていう変数を変えてもらうと他の画像を集めることができます。(コードに書いてあるURLを踏んでもらうとURLの貼り方がわかると思います)
main.ipynb
from time import sleep
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

from PIL import Image
import io

#requests.exceptions.ConnectionErrorの対処法
headers = requests.utils.default_headers()
headers.update(
    {
        'User-Agent': 'My User Agent 1.0',
    }
)

#1ページ目のurl
url='https://www.bing.com/images/search?view=detailV2&ccid=%2BSD9RruV&id=644FB24E587C81A723C6A25CEB9EDF9C018A9573&thid=OIP.-SD9RruVNsPqlK-oMbAZmQEsEA&mediaurl=https%3A%2F%2Fi.daily.jp%2Fgossip%2F2021%2F04%2F15%2FImages%2Ff_14244219.jpg&exph=821&expw=960&q=ROLAND+%e8%8a%b8%e8%83%bd%e4%ba%ba&simid=608016628962306871&form=IRPRST&ck=79BE118AA9DCCFCC0FB1D8617A2F1D51&selectedindex=29&ajaxhist=0&ajaxserp=0&vt=0&sim=11'

options = Options()
#コメントアウトを解くとブラウザが表示されなくなる
#options.add_argument('--headless')

#ブラウザの(Chrome)立ち上げ
browser = webdriver.Chrome("C:\Test_Folder\chromedriver.exe", options = options)
#待機時間
sleep(2)

#urlの移動
browser.get(url)
#待機時間
sleep(2)

#画像を500枚集める
for i in range(500):
    #imgのurlを取得
    img_tab = browser.find_elements_by_xpath('//div[@class="imgContainer"]/img')[1]
    img_url = img_tab.get_attribute('src')
    #imgのurlを開ける
    try:
        img = Image.open(io.BytesIO(requests.get(img_url,headers=headers).content))
    #エラーなら次の画像に行く
    except:
        next_button = browser.find_element_by_id('navr')
        next_button.click()
        continue
    
    
    #imgがjpgかjpegならそのままjpgで保存
    if img_url[-3:] == 'jpg' or img_url[-4:] == 'jpeg':
         #jpgで保存してみる
        try:
            img.save('data/'+str(i)+'.jpg')
        #エラーなら保存しない
        except:
            print('exception')
    #imgがpngなら変換して保存
    elif img_url[-3:] == 'png':
        # jpg画像に変換
        try:
            img = img.convert("RGB")
            img.save('data/'+str(i)+'.jpg')
        #エラーなら保存しない
        except:
            print('exception')
    
    #jpg系かpngでもないなら
    else:
        #jpgで保存してみる
        try:
            img.save('data/'+str(i)+'.jpg')
        #エラーなら保存しない
        except:
            print('exception')
        
    #次のボタンを探して押す
    next_button = browser.find_element_by_id('navr')
    next_button.click()

#ブラウザを閉じる
browser.quit()

結果

下の画像のように画像を集めることができました。
image.png

あとがき

どうですか?これがPythonのちからです。皆さんもPythonやりたくなったでしょ?

久しぶりにスクレイピングするとやり方を完全に忘れていました。定期的に使ってないとだめですね!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?