乃木坂46のメンバー秋元真夏のブログの写真をスクレイピングする

# 乃木坂46のメンバー秋元真夏のブログの写真をスクレイピングする

BeautifulSoupの使い方の練習もかねて、秋元真夏のブログの写真を全て保存するプログラムを作成した。

```python
url = 'http://blog.nogizaka46.com/manatsu.akimoto/'
headers = {
        "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
        }
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "lxml")
```
<img width="1023" alt="スクリーンショット 2020-02-05 19.15.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275145/40fe7d97-271d-dd96-0d4c-c8f1871055c5.png">


- まず、urlは秋元真夏のブログのトップページ。スクショの右下部分が過去のブログのアーカイブ。
- urlにアクセスするモジュールとしては、urllibモジュールとrequestsモジュールがあるが、requestsモジュールの方が直感的で使いやすいらしい。本記事でもこちらを使用した。ただ、後述するが、urlから画像を保存する際はurllibモジュールのurlretrieve関数を使っている。
- get要求をするにあたって、403エラーが出てしまった。これはユーザエージェントをfirefoxに偽装することで解決した。
- get要求のresponseをhtmlの整形モジュールであるBeautifulSoupに与える。


```python
past_blog_link_list = []


for option_tag in option_tag_list:
    if type(option_tag) == str:
        continue
        # なぜかoption_tagタグではない、strの型のものも引っかかるので、除外。
    link = option_tag['value']
    if re.search('\d{6}$', link):
    #　過去のブログのリンク先のリストは201212のような形式になっている。こうしたものだけ抽出。
        past_blog_link_list += [link]
```

- optionタグを全て取得し、そのvalueが201212のように、年、月の並びとなっているもののsrc属性を取得する。これが、過去の月ごとのブログへのリンクとなる。



```python
# for past_blog_link in past_blog_link_list:
os.chdir('/Users/mizukoshiryuuhei/nogi_pic/nogizaka_pic')
cnt = 1
for past_blog_link in past_blog_link_list:
    response = requests.get(past_blog_link, headers=headers)
    soup = BeautifulSoup(response.text, "lxml")
    img_tag_list = soup.find_all('img')
    for img_tag in img_tag_list:
        img_link = img_tag['src']
        if re.search('jpeg$', img_link):
            try:
                urlretrieve(img_link, f"akimoto_manatsu_blog_{cnt}.jpg")
                cnt += 1
            except error:
            # urllibのリクエストのエラーの基底クラス
                pass


print(f'{cnt} pictures were saved')
```

- 得られたそれぞれのリンクごとに、またget要求。先ほどと同じ要領でresposnseをbeautiful soupに与え、imgタグのsrc属性を取得。urlretreiveによって、jpegを保存。(本当はよくないが)エラーは全てexcept節に放り込んだ。
- 全部で1630枚の画像を保存できた。


```python
import requests
from bs4 import BeautifulSoup
import re
from urllib.request import urlretrieve
from urllib import error
import os



url = 'http://blog.nogizaka46.com/manatsu.akimoto/'
headers = {
        "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0",
        }
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "lxml")
# 過去のブログのリンク先のリスト(月別)
option_tag_list = soup.find_all('option')
past_blog_link_list = []

for option_tag in option_tag_list:
    if type(option_tag) == str:
        continue
        # なぜかoption_tagタグではない、strの型のものも引っかかるので、除外。
    link = option_tag['value']
    if re.search('\d{6}$', link):
    #　過去のブログのリンク先のリストは201212のような形式になっている。こうしたものだけ抽出。
        past_blog_link_list += [link]


# for past_blog_link in past_blog_link_list:
os.chdir('/Users/mizukoshiryuuhei/nogi_pic/nogizaka_pic')
cnt = 1
for past_blog_link in past_blog_link_list:
    response = requests.get(past_blog_link, headers=headers)
    soup = BeautifulSoup(response.text, "lxml")
    img_tag_list = soup.find_all('img')
    for img_tag in img_tag_list:
        img_link = img_tag['src']
        if re.search('jpeg$', img_link):
            try:
                urlretrieve(img_link, f"akimoto_manatsu_blog_{cnt}.jpg")
                cnt += 1
            except error:
            # urllibのリクエストのエラーの基底クラス
                pass


print(f'{cnt} pictures were saved')
```

![akimoto_manatsu_blog_107.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275145/de9c42b6-a880-fcd0-265c-eb39c31b447b.jpeg)!