きゃっとぐるーぶ

忘れてもいいようにメモを取っても、メモを取ったことを忘れる男の備忘録

PythonでYahooの画像検索から画像をスクレイピング

プログラミングに興味を持ち、「作りたいもの」を考え続けてもう7年もの月日が経ちました。 まるで「自分探しの旅」をする意識高い系の若者のようにそこらへんを彷徨い続けています。

ここ数日、プログラミング熱が再発したのでコードを書き始めたらまたスクレイピングですよ。 好きだねぇ、あんた。

from bs4 import BeautifulSoup
import requests
from urllib.parse import quote
from time import sleep
import os
import sys


def download_img(url, save_path):
    r = requests.get(url, stream=True)
    if r.status_code == 200:
        with open(save_path, "wb") as f:
            f.write(r.content)

def loop_download(links, save_path):
    for i, link in enumerate(links):
        fname = f'{i:02}.jpg'
        p = os.path.join(save_path, fname)
        if not os.path.exists(p):
            download_img(link, p)
        sleep(0.2)

def search(search_keyword, search_pagenum):
    # 検索ワードを%エンコード
    quoted_keyword = quote(search_keyword)
    search_url = f'https://search.yahoo.co.jp/image/search?fr=bb_top_v2_sa&p=\
            {quoted_keyword}&ei=UTF-8&b=\
            {search_pagenum}&ctype=face'

    r = requests.get(search_url)

    if r.status_code == 200:
        soup = BeautifulSoup(r.text, 'html.parser')

    # alt属性
    alt_attrs = f"「{search_keyword}」の画像検索結果"
    img_tags = soup.find_all('img', attrs={'alt': alt_attrs})

    links = []

    for img_link in img_tags:
        link = img_link['rel'].split('|')[0]
        links.append(link)

    return links # list


def pagenation(n):
    return [x for x in range(1, n * 20, 20)]


def show_usage():
    msg = """
    $ python yid.py <検索キーワード> <ページ数>
    """
    print(msg, file=sys.stderr)


def main():
    args = sys.argv[1:]

    if len(args) < 2:
        show_usage()
        return 1

    search_keyword = args[0]
    pagenations = pagenation(int(args[1]))
    current_dir = os.path.dirname(os.path.abspath('__file__'))

    for search_pagenum in pagenations:
        save_path = f'{current_dir}/yahoo_images/{search_keyword}/{search_pagenum}'
        if not os.path.isdir(save_path):
            os.makedirs(save_path)

        links = search(search_keyword, search_pagenum)
        loop_download(links, save_path)
    
    return 0

if __name__ == "__main__":
    sys.exit(main())

catgroove.hatenablog.com

増補改訂Pythonによるスクレイピング&機械学習 開発テクニック

増補改訂Pythonによるスクレイピング&機械学習 開発テクニック

  • 作者:クジラ飛行机
  • 出版社/メーカー: ソシム
  • 発売日: 2018/12/15
  • メディア: 単行本