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())
増補改訂Pythonによるスクレイピング&機械学習 開発テクニック
- 作者:クジラ飛行机
- 出版社/メーカー: ソシム
- 発売日: 2018/12/15
- メディア: 単行本