2
1

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 3 years have passed since last update.

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

Last updated at Posted at 2020-02-05

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

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

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")
スクリーンショット 2020-02-05 19.15.28.png
  • まず、urlは秋元真夏のブログのトップページ。スクショの右下部分が過去のブログのアーカイブ。
  • urlにアクセスするモジュールとしては、urllibモジュールとrequestsモジュールがあるが、requestsモジュールの方が直感的で使いやすいらしい。本記事でもこちらを使用した。ただ、後述するが、urlから画像を保存する際はurllibモジュールのurlretrieve関数を使っている。
  • get要求をするにあたって、403エラーが出てしまった。これはユーザエージェントをfirefoxに偽装することで解決した。
  • get要求のresponseをhtmlの整形モジュールであるBeautifulSoupに与える。
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属性を取得する。これが、過去の月ごとのブログへのリンクとなる。
# 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枚の画像を保存できた。
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!

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?