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

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

## はじめに
僕はすぐ記憶が無くなるので記事を書くことにしました。
あくまでも備忘録として書くので、**「わかりにくい」** とかは受け付けません。
今回は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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1621476/9be0310e-8c90-38f4-0f91-603603beed07.png)

## あとがき
どうですか？これが**Python**のちからです。皆さんもPythonやりたくなったでしょ？

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