質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1016閲覧

yahoo画像検索から画像をスクレイピングしたい

matt17

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/10/15 06:02

yahoo画像検索から画像をスクレイピングしたい

あるサイトからyahoo画像検索をスクレイピングするコードが載っていて、そちらを拝借してスクレイピングしようとしました。
しかし、スクレイピングできたのは画像ではなく、各画像のホームページでした。
画像だけを保存したい場合はどのようにすれば良いのでしょうか。

該当のソースコード

python

1#coding: utf-8 2import os 3import sys 4import traceback 5from mimetypes import guess_extension 6from time import time, sleep 7from urllib.request import urlopen, Request 8from urllib.parse import quote 9from bs4 import BeautifulSoup 10 11#任意のメールアドレス 12#ツールを使ってダウンロードするときのマナー 13MY_EMAIL_ADDR = '@.com' 14 15class Fetcher: 16 def __init__(self, ua=''): 17 self.ua = ua 18 19 def fetch(self, url): 20 req = Request(url, headers={'User-Agent': self.ua}) 21 try: 22 with urlopen(req, timeout=3) as p: 23 b_content = p.read() 24 mime = p.getheader('Content-Type') 25 except: 26 sys.stderr.write('Error in fetching {}\n'.format(url)) 27 sys.stderr.write(traceback.format_exc()) 28 return None, None 29 return b_content, mime 30 31fetcher = Fetcher(MY_EMAIL_ADDR) 32 33def fetch_and_save_img(num): 34 num_self = num 35 #dataというディレクトリが作られる 36 data_dir = 'data/' 37 if not os.path.exists(data_dir): 38 os.makedirs(data_dir) 39 40 img_urls = img_url_list(num_self)[0] 41 num_self2 = img_url_list(num_self)[1] 42 s = num_self2 - 21 43 44 for i, img_url in enumerate(img_urls): 45 sleep(0.1) 46 img, mime = fetcher.fetch(img_url) 47 if not mime or not img: 48 continue 49 ext = guess_extension(mime.split(';')[0]) 50 if ext in ('.jpe', '.jpeg'): 51 ext = '.jpg' 52 if not ext: 53 continue 54 result_file = os.path.join(data_dir, str(s) + ext) 55 with open(result_file, mode='wb') as f: 56 f.write(img) 57 s += 1 58 print('fetched', img_url) 59 60 if len(img_url) != 0: 61 fetch_and_save_img(num_self2) 62 63def img_url_list(num): 64 """ 65 using yahoo (this script can't use at google) 66 """ 67 num_self = num 68 #このURL適宜変更 69 #具体的には簡易検索の2ページ目のURL 70 url = 'https://search.yahoo.co.jp/image/search?p=oldskool&oq=&ei=UTF-8&xargs=2&b={}'.format(num_self) 71 byte_content, _ = fetcher.fetch(url) 72 structured_page = BeautifulSoup(byte_content.decode('UTF-8'), 'html.parser') 73 img_link_elems = structured_page.find_all('a', attrs={'target': 'imagewin'}) 74 img_urls = [e.get('href') for e in img_link_elems if e.get('href').startswith('http')] 75 img_urls = list(set(img_urls)) 76 num_self += 20 77 return img_urls,num_self 78 79if __name__ == '__main__': 80 # word = sys.argv[1] 81 # fetch_and_save_img(word) 82 num = 1 83 fetch_and_save_img(num)

python初心者で知識があまりありません。
申し訳ありませんが、どなたかご教授くださいませ。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

スクレイピングは CSS セレクタを学習してからやりましょう。

CSS3のセレクタ全42種 まとめておさらい使い方リファレンス

変更箇所

属性 target="imagewin" を持つ a タグの子 img タグを選択し、その属性 src を抽出しています。

def img_url_list(num): url = 'https://search.yahoo.co.jp/image/search?p=oldskool&oq=&ei=UTF-8&xargs=2&b={}'.format(num) byte_content, _ = fetcher.fetch(url) soup = BeautifulSoup(byte_content.decode('UTF-8'), 'html.parser') img_elems = soup.select('a[target=imagewin] > img') print(img_elems) img_urls = [e['src'] for e in img_elems] print(img_urls) return img_urls, num + 20

投稿2018/10/15 06:30

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matt17

2018/10/15 07:11

ありがとうございます! リンクしてくださったページも学習して参考にさせていただきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問