pythonで画像のスクレイピング 

## 画像スクレイピング とは
- [Pythonで画像スクレイピングをしよう](https://qiita.com/neet-AI/items/98d4194872ee4f53e3b4)

簡単にいうと、
ネットから、100枚くらい推しの写真ほしいな！😍ってなったとき、一枚一枚ダウンロードしていくのは時間と手間がかかってしまう!!
プログラム書けば、一気に複数(10枚でも100枚でも)の画像をダウンロードできる!!って感じですねww

# やること
1. 画像を検索
1. 指定ディレクトリに保存

## 環境
- 今回は、[google colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)を使って、[google drive](https://www.google.com/intl/ja_jp/drive/)に画像データを保存します。

## ダウンロードに使ったサイト

- [yahoo image search](https://images.search.yahoo.com/?guccounter=1&guce_referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&guce_referrer_sig=AQAAAJZNco7VHLNeCCvNc3gIJ7gAnQ4FJtZCnqL-iRBc7g7AYeAyPEDop8dk3q7hCMLMZg-qSM_CxSuOHYYWE_n4-HtTcPFCC-ndATnL3dDLiTmzMewuMnysbXbdf_HgGEjz70kUsWEuXhRI2P9r-KkPdISbiWpc_6PSYANwqo6KC2EQ)

## ダウンロードに必要なライブラリのインポート

```python
import requests
from bs4 import BeautifulSoup
```

## 画像を検索してurlをコピー

``page_url = '#'``#の部分に検索した画像のURLを貼ります。

```python
# 検索ページurl
page_url = 'URL'
```

## 検索したサイトの情報を取得

```python
r = requests.get(page_url)
soup = BeautifulSoup(r.text)
```

```python
# soup.find_all("img")
```

``soup.find_all('img')``で取得したデータから``imgタグ``のみを表示
以下の画像のように表示される.
![スクリーンショット 2021-09-19 1.01.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/40d2b14c-3007-3ac5-6dcb-815acb157a9a.png)


## urlのみを取得する

imgタグからurlのみを取得する

```python
img_tags = soup.find_all("img")
img_urls = []

for img_tag in img_tags:
  url = img_tag.get("src")
  if url != None:
    img_urls.append(url)
# print(img_urls)  # ダウンロードする写真データのurl
```

``# print(img_urls)  # ダウンロードする写真データのurl``urlを取得できているか、確認するために書いた.

## ダウンロードするための関数

#### 参考サイト
- [【Python入門 #005】 齋藤飛鳥の画像を100枚スクレイピング。Pythonのできることの例: 画像をダウンロード。プログラミング初心者ができる簡単な内容です。](https://garreta17.sakura.ne.jp/programing/?p=4292)

```python
def download_image(url, file_path):
  r = requests.get(url, stream=True)

  if r.status_code == 200:
    with open(file_path, "wb") as f:
      f.write(r.content)
```

## 保存先の指定

ライブラリをインポートして、マウントします。(google colaboratoryを使用している場合)

```python
# ダウンロード先ファイルの参照(google drive用)
import os
from google.colab import drive
drive.mount('./gdrive')
```

![スクリーンショット 2021-09-19 1.11.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/925d8fd4-78ee-b359-acd6-f716e3b48089.png)

画像のようにurlが表示されるのでリンク先に飛んで、以下のページの文字をコピーし、上の画像の四角い枠に貼り付けてください。
![スクリーンショット 2021-09-19 1.12.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/f6456c77-52b8-85fb-45df-878a65173bfa.png)

完了すると以下のように表示されます.

```
Mounted at ./gdrive
```

ダウンロードのパスを指定します。

```python
google_drive_save_dir = "./gdrive/My Drive/ここから先は自分で決める" # ダウンロード先の指定
```

## ダウンロード

画像データが多いのでファイル名を数字で管理する.

```python
for index, url in enumerate(img_urls):
  file_name = "{}.jpg".format(index)
```

ダウンロード開始↓

```python
  print(file_name)
  image_path = os.path.join(google_drive_save_dir, file_name)
  print(image_path)

  download_image(url=url, file_path=image_path)
```

![スクリーンショット 2021-09-19 1.17.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712534/052dfa84-a9c1-4c1f-689f-913ab61b7691.png)

問題なければ画像のように表示され、画像データは次々と保存されます.


## 今後
このダウンロードしたデータをデータセットとしてまとめて、ディープラーニングの記事を書きます。

## 参考サイト
- [【Python入門 #005】 齋藤飛鳥の画像を100枚スクレイピング。Pythonのできることの例: 画像をダウンロード。プログラミング初心者ができる簡単な内容です。](https://garreta17.sakura.ne.jp/programing/?p=4292)

## 便利なチートシート
- [Google Colaboratory(Colab)でスクレイピングするときのチートシート](https://qiita.com/plumfield56/items/f344b23e453ed8a628b6)


## 全プログラムコード
```python
import requests
from bs4 import BeautifulSoup

page_url = 'URL'

r = requests.get(page_url)
soup = BeautifulSoup(r.text)

img_tags = soup.find_all("img")
img_urls = []

for img_tag in img_tags:
  url = img_tag.get("src")
  if url != None:
    img_urls.append(url)


def download_image(url, file_path):
  r = requests.get(url, stream=True)

  if r.status_code == 200:
    with open(file_path, "wb") as f:
      f.write(r.content)


# ダウンロード先ファイルの参照(google drive用)
import os
from google.colab import drive
drive.mount('./gdrive')

google_drive_save_dir = "./gdrive/My Drive/ここから先は自分で決める" # ダウンロード先の指定

for index, url in enumerate(img_urls):
  file_name = "{}.jpg".format(index)
  print(file_name)
  image_path = os.path.join(google_drive_save_dir, file_name)
  print(image_path)

  download_image(url=url, file_path=image_path)
```