Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

pythonでのスクレイピングによる画像収集方法

前回Kerasを用いた画像識別を行いました。
elsammit-beginnerblg.hatenablog.com

こちらのブログの中では、画像の収集方法については触れませんでした。
今回は自分が用いた画像収集方法である、スクレイピングについてまとめたいと思います!!
スクレイピングpythonを用います。

Pythonスクレイピングの基本と実践 データサイエンティストのためのWebデータ収集術 impress top gearシリーズ

新品価格
¥3,267から
(2020/10/15 22:38時点)



スクレイピングとは?

スクレイピングとは、
データを収集した上で加工しやすくすること
です。

似た言葉にクローリングがありますが、
クローリングとは、インターネット上に存在するWebサイト間を行き来し、それらの情報を収集することです。
よく知られた例として、検索エンジンがサイトをインデックスする際にも、クローリングが行われています。

スクレイピングは注意して行わなければなりません。
スクレイピングを行うと、下記に抵触する可能性があります。
著作権法(昭和45年5月6日)と業務妨害罪(刑法第二編第三十五章「信用及び業務に対する罪」(第233条 - 第234条 - 第234条の2))

ただデータをそのまま公開したりせず、自分なりの加工・表現を加えたり、
相手サイトに大幅な負荷をかけない
などの注意が必要になります!!

スクレイピング前準備

pythonスクレイピングを行う上でBeautifulSoupを利用します。
BeautifulSoupはこちらでダウンロード・インストールすることができます。

pip install beautifulsoup4

スクレイピング実行

今回はいらすとや上で画像取集のためのスクレイピングになります。
f:id:Elsammit:20201015223559p:plain

全体ソースコードはこちらになります。

import time
import re
import requests
from pathlib import Path
from bs4 import BeautifulSoup

OutPutFolder = Path('test')
OutPutFolder.mkdir(exist_ok=True)

url = 'スクレイピング対象のURL'

LinkList = []

html = requests.get(url).text
soup = BeautifulSoup(html,'lxml')

List = soup.select('div.boxmeta.clearfix > h2 > a')

for a in List:
    print(a)
    link_url = a.attrs['href']
    LinkList.append(link_url)
    time.sleep(1.0)
    
for page_url in LinkList:
    page_html = requests.get(page_url).text
    page_soup = BeautifulSoup(page_html, "lxml")
    img_list = page_soup.select('div.entry > div > a > img')
    for img in img_list:
        img_url = (img.attrs['src'])
        filename = re.search(".*\/(.*png|.*jpg)$",img_url)
        save_path = OutPutFolder.joinpath(filename.group(1))
        time.sleep(1.0)
        try:
            image = requests.get(img_url)
            open(save_path, 'wb').write(image.content)
            print(save_path)
            time.sleep(1.0)
        except ValueError:
            print("ValueError!")


まず、

OutPutFolder = Path('test')
OutPutFolder.mkdir(exist_ok=True)

により、ダウンロード先のフォルダが存在しない場合に新規に作成します。

次にこちらにより、url上のhtml形式の文字列を収集いたします。
そして、その中で特定のタグ収集を行います。
今回は、
div.boxmeta.clearfix > h2 > a
になります。

html = requests.get(url).text
soup = BeautifulSoup(html,'lxml')

List = soup.select('div.boxmeta.clearfix > h2 > a')

こちらのタグですが、ホームページ上で右クリック⇒検証を押下すればhtmlが表示されるので、
こちらから必要なタグやstyleを選択すればOKです。

そしてそして!!

for a in List:
    print(a)
    link_url = a.attrs['href']
    LinkList.append(link_url)
    time.sleep(1.0)

こちらでリンク先URLの一覧を取得します。
※リンクから収集するのでなければ、こちらの処理は不要になります。

最後に、リンク先ホームページ上から、
imgタグを収集し、画像をダウンロードしていきます。

for page_url in LinkList:
    page_html = requests.get(page_url).text
    page_soup = BeautifulSoup(page_html, "lxml")
    img_list = page_soup.select('div.entry > div > a > img')
    for img in img_list:
        img_url = (img.attrs['src'])
        filename = re.search(".*\/(.*png|.*jpg)$",img_url)
        save_path = OutPutFolder.joinpath(filename.group(1))
        time.sleep(1.0)
        try:
            image = requests.get(img_url)
            open(save_path, 'wb').write(image.content)
            print(save_path)
            time.sleep(1.0)
        except ValueError:
            print("ValueError!")

以上です!!

■最後に

今回はスクレイピングが画像収集方法についてまとめてみました!!
こちらの方法で画像収集すれば機械学習に役立ちそうです!!
もっと機械学習頑張りたいな😆