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

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

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

Q&A

2回答

1277閲覧

google検索で画像のスクレイピングをしたい

jagaimo_potato

総合スコア4

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

0グッド

1クリップ

投稿2020/03/15 15:29

実現したいこととエラー

スクレイピングで鳥の画像を集めたいと思い、コードを調べて書いたのですが、
「Begining searching bird
-> No more images
-> Found 0 images

Complete downloaded
└─ Failed to download 0 images」

となってしまい、画像が集められません。何が原因なのか調べても全く分からなかったので質問させていただきました。

該当のソースコード

import

1import json 2import os 3import urllib 4 5from bs4 import BeautifulSoup 6import requests 7 8 9class Google(object): 10 def __init__(self): 11 self.GOOGLE_SEARCH_URL = "https://www.google.co.jp/search" 12 self.session = requests.session() 13 self.session.headers.update( 14 { 15 "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:10.0) \ 16 Gecko/20100101 Firefox/10.0" 17 } 18 ) 19 20 def search(self, keyword, maximum): 21 print(f"Begining searching {keyword}") 22 query = self.query_gen(keyword) 23 return self.image_search(query, maximum) 24 25 def query_gen(self, keyword): 26 # search query generator 27 page = 0 28 while True: 29 params = urllib.parse.urlencode( 30 {"q": keyword, "tbm": "isch", "ijn": str(page)} 31 ) 32 33 yield self.GOOGLE_SEARCH_URL + "?" + params 34 page += 1 35 36 def image_search(self, query_gen, maximum): 37 results = [] 38 total = 0 39 while True: 40 # search 41 html = self.session.get(next(query_gen)).text 42 soup = BeautifulSoup(html, "lxml") 43 elements = soup.select(".rg_meta.notranslate") 44 jsons = [json.loads(e.get_text()) for e in elements] 45 image_url_list = [js["ou"] for js in jsons] 46 47 # add search results 48 if not len(image_url_list): 49 print("-> No more images") 50 break 51 elif len(image_url_list) > maximum - total: 52 results += image_url_list[: maximum - total] 53 break 54 else: 55 results += image_url_list 56 total += len(image_url_list) 57 58 print("-> Found", str(len(results)), "images") 59 return results 60 61 62def main(): 63 parser = argparse.ArgumentParser(argument_default=argparse.SUPPRESS) 64 parser.add_argument("-t", "--target", help="target name", type=str, required=True) 65 parser.add_argument( 66 "-n", "--number", help="number of images", type=int, required=True 67 ) 68 parser.add_argument( 69 "-d", "--directory", help="download location", type=str, default="./data" 70 ) 71 parser.add_argument( 72 "-f", 73 "--force", 74 help="download overwrite existing file", 75 type=bool, 76 default=False, 77 ) 78 79 args = parser.parse_args() 80 81 data_dir = args.directory 82 target_name = args.target 83 84 os.makedirs(data_dir, exist_ok=True) 85 os.makedirs(os.path.join(data_dir, target_name), exist_ok=args.force) 86 87 google = Google() 88 89 # search images 90 results = google.search(target_name, maximum=args.number) 91 92 # download 93 download_errors = [] 94 for i, url in enumerate(results): 95 print("-> Downloading image", str(i + 1).zfill(4), end=" ") 96 try: 97 urllib.request.urlretrieve( 98 url, 99 os.path.join(*[data_dir, target_name, str(i + 1).zfill(4) + ".jpg"]), 100 ) 101 print("successful") 102 except BaseException: 103 print("failed") 104 download_errors.append(i + 1) 105 continue 106 107 print("-" * 50) 108 print("Complete downloaded") 109 print("├─ Successful downloaded", len(results) - len(download_errors), "images") 110 print("└─ Failed to download", len(download_errors), "images", *download_errors) 111 112 113if __name__ == "__main__": 114 main()

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

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

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

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

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

guest

回答2

0

そもそも、googleに対してスクレイピングするのは規約違反のようですよ。
他の方への回答を貼っておきます。
Googleを対象にループ処理する場合の適切な間隔

投稿2020/03/16 00:16

jeanbiego

総合スコア3966

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

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

jagaimo_potato

2020/03/17 06:33

そうなんですね!知りませんでした。 ご指摘いただきありがとうございました。
guest

0

iclawerをつかって見てください

投稿2020/03/18 10:38

temps1101

総合スコア134

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問