いらすとやの画像をスクレイピングしてみよう!
資料作成などで「いらすとや」さんの画像をよく利用しますが、ガバっと取り出したいときがあります。「とりあえず全部」みたいなことありますよね。
すぐに作れそうだったのでやってみようと作成。
参考にしたサイトは こちらです。
参考にしたスクリプトから関数ベースにアレンジを加えてみました。
関数ベースなのでよりステップバイステップでどんな値が返されてるのかわかるかと思います。
作成した環境について
- windows10
- python3.9
フォルダ作成の関数に関してはwindows環境のみ適用されるものになっています。
必要なライブラリ
pip install requests
pip install beautifulsoup4
pip install lxml
スクリプト
irasutoya.py
# 「いらすとや」さんの画像データを集めるスクリプト
import re
import time
import requests
from pathlib import Path
from bs4 import BeautifulSoup
# デスクトップに検索の保存フォルダ作成と作成済みの場合
# 保存されているファイルを削除
def make_temp_savedir(folder_name):
desktop_path = Path.home().joinpath('Desktop')
output_folder = Path(desktop_path).joinpath(folder_name)
output_folder.mkdir(exist_ok=True)
files = list(output_folder.iterdir())
[file.unlink(missing_ok=True) for file in files]#検索結果
return output_folder
# 検索結果ページより表示されている各イラストのurlを取得
def fetch_search_result_url(search_word):
search_url = f'https://www.irasutoya.com/search?q={search_word}'
html = requests.get(search_url).text
soup = BeautifulSoup(html, 'lxml')
a_list =soup.select('div.boxmeta.clearfix > h2 > a')
return [a.attrs['href'] for a in a_list]
# イラスト一覧できるurlからimgタグ部分を取得
def fetch_img_tag(picture_url):
page_html = requests.get(picture_url).text
page_soup = BeautifulSoup(page_html, "lxml")
time.sleep(1)
return page_soup.select('div.entry > div > a > img')
# imgタグの中のsrc部分の文字列を取得
def fetch_img_url(source_url):
return [(url.attrs['src']) for url in source_url]
# 保存先のpathを作成
def get_saved_path(img_urls,output_folder):
file_names = [re.search(".*\/(.*png|.*jpg)$",img_url) for img_url in img_urls]
return [output_folder.joinpath(file_name.group(1)) for file_name in file_names]
# 画像元urlから画像取得
def get_and_save_picture(img_url,save_path):
try:
image = requests.get(img_url)
with open(save_path, 'wb') as f:
f.write(image.content)
time.sleep(1)
except ValueError:
pass
"""search_irasutoya関数の処理手順
1.検索結果のurlのhtmlを取得
2.検索結果のhtmlの中に画像が置かれたurlを全て取得
3.画像が置かれたurlのimgタグ部分のみを全て取得
4.imgタグのsrc部分を抜き出して画像元のurlを全取得
5.保存先のフォルダ名と画像元のurlのファイル名を結合してパスを作成
6.画像元のurlから画像データを抜き出して,5のパスに保存する。
"""
def search_irasutoya(search_word,save_folder_name):
output_folder = make_temp_savedir(save_folder_name)
picture_urls = fetch_search_result_url(search_word) #1,2
for picture_url in picture_urls:
img_tags = fetch_img_tag(picture_url) #3
img_urls =fetch_img_url(img_tags) #4
save_paths = get_saved_path(img_urls,output_folder) #5
for img_url,save_path in zip(img_urls,save_paths):
get_and_save_picture(img_url,save_path) #6
if __name__ =='__main__':
search_word = 'PC'
save_folder_name = 'いらすとや検索結果'
search_irasutoya(search_word,save_folder_name)