乃木坂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")
- まず、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')